solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 3d94bd7475ec279b0cb1eaddd6f47195cec09182
parent 7ea1a6d6882a934a345fdf27c8e3fd39f5894347
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 11 Dec 2017 15:26:48 +0100

Add the microfacet parameter to the mirror material

One can define the type the microfacet distribution of the mirror
material. The supported distributions are 'beckmann' and 'pillbox'.

Diffstat:
Mcmake/CMakeLists.txt | 6+++---
Msrc/ssol.h | 9++++++++-
Msrc/ssol_material.c | 31++++++++++++++++++++++++-------
Msrc/ssol_material_c.h | 1+
Msrc/test_ssol_by_receiver_integration.c | 2+-
Msrc/test_ssol_material.c | 25++++++++++++++++++-------
Msrc/test_ssol_solver1.c | 4++--
Msrc/test_ssol_solver2.c | 2+-
Msrc/test_ssol_solver2b.c | 2+-
Msrc/test_ssol_solver3.c | 2+-
Msrc/test_ssol_solver4.c | 2+-
Msrc/test_ssol_solver5.c | 2+-
Msrc/test_ssol_solver6.c | 2+-
Msrc/test_ssol_solver7.c | 2+-
Msrc/test_ssol_solver8.c | 2+-
Msrc/test_ssol_solver9.c | 2+-
16 files changed, 66 insertions(+), 30 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -28,7 +28,7 @@ find_package(RSys 0.6 REQUIRED) find_package(Star3D 0.4.1 REQUIRED) find_package(Star3DUT 0.2 REQUIRED) find_package(StarCPR 0.1 REQUIRED) -find_package(StarSF 0.3 REQUIRED) +find_package(StarSF 0.4 REQUIRED) find_package(StarSP 0.4 REQUIRED) find_package(OpenMP 1.2 REQUIRED) @@ -50,8 +50,8 @@ rcmake_append_runtime_dirs(_runtime_dirs RSys Star3D Star3DUT StarCPR StarSF Sta # Configure and define targets ################################################################################ set(VERSION_MAJOR 0) -set(VERSION_MINOR 6) -set(VERSION_PATCH 1) +set(VERSION_MINOR 7) +set(VERSION_PATCH 0) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set(SSOL_FILES_SRC diff --git a/src/ssol.h b/src/ssol.h @@ -82,6 +82,12 @@ enum ssol_material_type { SSOL_MATERIAL_TYPES_COUNT__ }; +enum ssol_microfacet_distribution { + SSOL_MICROFACET_BECKMANN, + SSOL_MICROFACET_PILLBOX, + SSOL_MICROFACET_DISTRIBUTIONS_COUNT__ +}; + enum ssol_clipping_op { SSOL_AND, SSOL_SUB, @@ -799,7 +805,8 @@ ssol_dielectric_setup SSOL_API res_T ssol_mirror_setup (struct ssol_material* mtl, - const struct ssol_mirror_shader* shader); + const struct ssol_mirror_shader* shader, + const enum ssol_microfacet_distribution distrib); SSOL_API res_T ssol_matte_setup diff --git a/src/ssol_material.c b/src/ssol_material.c @@ -183,11 +183,24 @@ create_mirror_bsdf res = ssf_specular_reflection_setup(*bsdf, fresnel); if(res != RES_OK) goto error; } else { /* Glossy reflection */ - res = ssf_microfacet_distribution_create - (mtl->dev->allocator, &ssf_beckmann_distribution, &distrib); - if(res != RES_OK) goto error; - res = ssf_beckmann_distribution_setup(distrib, roughness); - if(res != RES_OK) goto error; + switch(mtl->data.mirror.distrib) { + /* Setup the microfacet distribution */ + case SSOL_MICROFACET_BECKMANN: + res = ssf_microfacet_distribution_create + (mtl->dev->allocator, &ssf_beckmann_distribution, &distrib); + if(res != RES_OK) goto error; + res = ssf_beckmann_distribution_setup(distrib, roughness); + if(res != RES_OK) goto error; + break; + case SSOL_MICROFACET_PILLBOX: + res = ssf_microfacet_distribution_create + (mtl->dev->allocator, &ssf_pillbox_distribution, &distrib); + if(res != RES_OK) goto error; + res = ssf_beckmann_distribution_setup(distrib, roughness); + if(res != RES_OK) goto error; + break; + default: FATAL("Unreachable code.\n"); break; + } /* Microfacet2 is not well suited for rendering since it cannot be * evaluated and consequently it returns an invalid result for direct @@ -472,15 +485,19 @@ ssol_dielectric_setup res_T ssol_mirror_setup - (struct ssol_material* material, const struct ssol_mirror_shader* shader) + (struct ssol_material* material, + const struct ssol_mirror_shader* shader, + const enum ssol_microfacet_distribution distrib) { if(!material || material->type != SSOL_MATERIAL_MIRROR - || !check_shader_mirror(shader)) + || !check_shader_mirror(shader) + || (unsigned)distrib >= SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) return RES_BAD_ARG; material->normal = shader->normal; material->data.mirror.reflectivity = shader->reflectivity; material->data.mirror.roughness = shader->roughness; + material->data.mirror.distrib = distrib; return RES_OK; } diff --git a/src/ssol_material_c.h b/src/ssol_material_c.h @@ -34,6 +34,7 @@ struct matte { struct mirror { ssol_shader_getter_T reflectivity; ssol_shader_getter_T roughness; + enum ssol_microfacet_distribution distrib; }; struct thin_dielectric { diff --git a/src/test_ssol_by_receiver_integration.c b/src/test_ssol_by_receiver_integration.c @@ -114,7 +114,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -48,10 +48,18 @@ test_mirror(struct ssol_device* dev) mirror.reflectivity = get_shader_reflectivity; mirror.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(NULL, &mirror) == RES_BAD_ARG); - CHK(ssol_mirror_setup(material, NULL) == RES_BAD_ARG); - CHK(ssol_mirror_setup(material, &mirror) == RES_OK); - CHK(ssol_mirror_setup(material, &mirror) == RES_OK); + CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) + == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) + == RES_BAD_ARG); + CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) + == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) + == RES_BAD_ARG); + CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); + CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_set_param_buffer(NULL, NULL) == RES_BAD_ARG); CHK(ssol_material_set_param_buffer(material, NULL) == RES_BAD_ARG); @@ -59,15 +67,18 @@ test_mirror(struct ssol_device* dev) CHK(ssol_material_set_param_buffer(material, pbuf) == RES_OK); mirror.normal = NULL; - CHK(ssol_mirror_setup(material, &mirror) == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) + == RES_BAD_ARG); mirror.normal = get_shader_normal; mirror.reflectivity = NULL; - CHK(ssol_mirror_setup(material, &mirror) == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) + == RES_BAD_ARG); mirror.reflectivity = get_shader_reflectivity; mirror.roughness = NULL; - CHK(ssol_mirror_setup(material, &mirror) == RES_BAD_ARG); + CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) + == RES_BAD_ARG); mirror.roughness = get_shader_roughness; CHK(ssol_material_ref_put(material) == RES_OK); diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -141,7 +141,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); @@ -383,7 +383,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity_2; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl2, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl2, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_object_create(dev, &m_object2) == RES_OK); CHK(ssol_object_add_shaded_shape(m_object2, square, m_mtl2, m_mtl2) == RES_OK); diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -143,7 +143,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -147,7 +147,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c @@ -117,7 +117,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c @@ -120,7 +120,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -118,7 +118,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver6.c b/src/test_ssol_solver6.c @@ -119,7 +119,7 @@ main(int argc, char** argv) m_shader.normal = get_shader_normal; m_shader.reflectivity = get_shader_reflectivity; m_shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &m_shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &m_shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_matte(dev, &bck_mtl) == RES_OK); bck_shader.normal = get_shader_normal; bck_shader.reflectivity = get_shader_reflectivity_2; diff --git a/src/test_ssol_solver7.c b/src/test_ssol_solver7.c @@ -124,7 +124,7 @@ main(int argc, char** argv) m_shader.normal = get_shader_normal; m_shader.reflectivity = get_shader_reflectivity; m_shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &m_shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &m_shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_matte(dev, &bck_mtl) == RES_OK); bck_shader.normal = get_shader_normal; bck_shader.reflectivity = get_shader_reflectivity_2; diff --git a/src/test_ssol_solver8.c b/src/test_ssol_solver8.c @@ -121,7 +121,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK); diff --git a/src/test_ssol_solver9.c b/src/test_ssol_solver9.c @@ -115,7 +115,7 @@ main(int argc, char** argv) shader.normal = get_shader_normal; shader.reflectivity = get_shader_reflectivity; shader.roughness = get_shader_roughness; - CHK(ssol_mirror_setup(m_mtl, &shader) == RES_OK); + CHK(ssol_mirror_setup(m_mtl, &shader, SSOL_MICROFACET_BECKMANN) == RES_OK); CHK(ssol_material_create_virtual(dev, &v_mtl) == RES_OK); CHK(ssol_object_create(dev, &m_object) == RES_OK);