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:
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);