Commit: 375f2bda79e25cfb259d56778270bc82ffe966f6
Author: Thomas Dinges
Date:   Thu Jun 16 14:01:48 2016 +0200
Branches: experimental-build
https://developer.blender.org/rB375f2bda79e25cfb259d56778270bc82ffe966f6

Apply D2002 for testing purposes (Cycles Multiscatter GGX)

===================================================================

M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/closure/bsdf.h
M       intern/cycles/kernel/closure/bsdf_util.h
M       intern/cycles/kernel/kernel_bake.h
M       intern/cycles/kernel/kernel_emission.h
M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_branched.h
M       intern/cycles/kernel/kernel_shader.h
M       intern/cycles/kernel/kernel_shadow.h
M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/split/kernel_shader_eval.h
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/kernel/svm/svm_types.h
M       intern/cycles/render/nodes.cpp
M       intern/cycles/util/util_math.h
M       source/blender/makesdna/DNA_node_types.h
M       source/blender/makesrna/intern/rna_nodetree.c

===================================================================

diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index 78a28b7..fbf7ee6 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -393,6 +393,9 @@ static ShaderNode *add_node(Scene *scene,
                        case BL::ShaderNodeBsdfAnisotropic::distribution_GGX:
                                aniso->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
                                break;
+                       case 
BL::ShaderNodeBsdfAnisotropic::distribution_MULTI_GGX:
+                               aniso->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_ANISO_ID;
+                               break;
                        case 
BL::ShaderNodeBsdfAnisotropic::distribution_ASHIKHMIN_SHIRLEY:
                                aniso->distribution = 
CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
                                break;
@@ -439,6 +442,9 @@ static ShaderNode *add_node(Scene *scene,
                        case 
BL::ShaderNodeBsdfGlossy::distribution_ASHIKHMIN_SHIRLEY:
                                glossy->distribution = 
CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID;
                                break;
+                       case BL::ShaderNodeBsdfGlossy::distribution_MULTI_GGX:
+                               glossy->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID;
+                               break;
                }
                node = glossy;
        }
@@ -455,6 +461,9 @@ static ShaderNode *add_node(Scene *scene,
                        case BL::ShaderNodeBsdfGlass::distribution_GGX:
                                glass->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID;
                                break;
+                       case BL::ShaderNodeBsdfGlass::distribution_MULTI_GGX:
+                               glass->distribution = 
CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID;
+                               break;
                }
                node = glass;
        }
@@ -469,6 +478,8 @@ static ShaderNode *add_node(Scene *scene,
                                refraction->distribution = 
CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
                                break;
                        case BL::ShaderNodeBsdfRefraction::distribution_GGX:
+                       /* Multiscattering GGX isn't supported for the 
Refraction BSDF. */
+                       case 
BL::ShaderNodeBsdfRefraction::distribution_MULTI_GGX:
                                refraction->distribution = 
CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
                                break;
                }
diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 61c484d..4f41ee0 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -76,6 +76,8 @@ set(SRC_CLOSURE_HEADERS
        closure/bsdf_diffuse.h
        closure/bsdf_diffuse_ramp.h
        closure/bsdf_microfacet.h
+       closure/bsdf_microfacet_multi.h
+       closure/bsdf_microfacet_multi_impl.h
        closure/bsdf_oren_nayar.h
        closure/bsdf_phong_ramp.h
        closure/bsdf_reflection.h
diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index f0add80..f318a61 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -20,6 +20,7 @@
 #include "../closure/bsdf_phong_ramp.h"
 #include "../closure/bsdf_diffuse_ramp.h"
 #include "../closure/bsdf_microfacet.h"
+#include "../closure/bsdf_microfacet_multi.h"
 #include "../closure/bsdf_reflection.h"
 #include "../closure/bsdf_refraction.h"
 #include "../closure/bsdf_transparent.h"
@@ -35,7 +36,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const 
ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, 
differential3 *domega_in, float *pdf)
+ccl_device int bsdf_sample(KernelGlobals *kg, ShaderData *sd, const 
ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, 
differential3 *domega_in, float *pdf)
 {
        int label;
 
@@ -85,6 +86,14 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
                        label = bsdf_microfacet_ggx_sample(kg, sc, 
ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, 
dI).dy, randu, randv,
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                       label = bsdf_microfacet_multi_ggx_sample(kg, sc, 
ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, 
dI).dy, randu, randv,
+                               eval, omega_in,  &domega_in->dx, 
&domega_in->dy, pdf, &ccl_fetch(sd, lcg_state));
+                       break;
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                       label = bsdf_microfacet_multi_ggx_glass_sample(kg, sc, 
ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, 
dI).dy, randu, randv,
+                               eval, omega_in,  &domega_in->dx, 
&domega_in->dy, pdf, &ccl_fetch(sd, lcg_state));
+                       break;
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -130,7 +139,7 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
        return label;
 }
 
-ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const 
ShaderClosure *sc, const float3 omega_in, float *pdf)
+ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData *sd, const 
ShaderClosure *sc, const float3 omega_in, float *pdf)
 {
        float3 eval;
 
@@ -172,6 +181,12 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf, 
&ccl_fetch(sd, lcg_state));
+                               break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_glass_eval_reflect(sc, ccl_fetch(sd, I), omega_in, 
pdf, &ccl_fetch(sd, lcg_state));
+                               break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -234,6 +249,12 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                        case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
                                eval = bsdf_microfacet_ggx_eval_transmit(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf, 
&ccl_fetch(sd, lcg_state));
+                               break;
+                       case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                               eval = 
bsdf_microfacet_multi_ggx_glass_eval_transmit(sc, ccl_fetch(sd, I), omega_in, 
pdf, &ccl_fetch(sd, lcg_state));
+                               break;
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
                        case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
@@ -286,6 +307,10 @@ ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure 
*sc, float roughness)
 
 #ifdef __SVM__
        switch(sc->type) {
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
+               case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
+                       bsdf_microfacet_multi_ggx_blur(sc, roughness);
+                       break;
                case CLOSURE_BSDF_MICROFACET_GGX_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
                case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_util.h 
b/intern/cycles/kernel/closure/bsdf_util.h
index 05816ba..89b1998 100644
--- a/intern/cycles/kernel/closure/bsdf_util.h
+++ b/intern/cycles/kernel/closure/bsdf_util.h
@@ -111,10 +111,9 @@ ccl_device float fresnel_dielectric_cos(float cosi, float 
eta)
        return 1.0f; // TIR(no refracted component)
 }
 
-#if 0
 ccl_device float3 fresnel_conductor(float cosi, const float3 eta, const float3 
k)
 {
-       float3 cosi2 = make_float3(cosi*cosi);
+       float3 cosi2 = make_float3(cosi*cosi, cosi*cosi, cosi*cosi);
        float3 one = make_float3(1.0f, 1.0f, 1.0f);
        float3 tmp_f = eta * eta + k * k;
        float3 tmp = tmp_f * cosi2;
@@ -124,7 +123,6 @@ ccl_device float3 fresnel_conductor(float cosi, const 
float3 eta, const float3 k
                                        (tmp_f + (2.0f * eta * cosi) + cosi2);
        return(Rparl2 + Rperp2) * 0.5f;
 }
-#endif
 
 ccl_device float smooth_step(float edge0, float edge1, float x)
 {
diff --git a/intern/cycles/kernel/kernel_bake.h 
b/intern/cycles/kernel/kernel_bake.h
index 8d05bef..9ee0b09 100644
--- a/intern/cycles/kernel/kernel_bake.h
+++ b/intern/cycles/kernel/kernel_bake.h
@@ -48,7 +48,7 @@ ccl_device void compute_light_pass(KernelGlobals *kg, 
ShaderData *sd, PathRadian
 
        /* evaluate surface shader */
        float rbsdf = path_state_rng_1D(kg, &rng, &state, PRNG_BSDF);
-       shader_eval_surface(kg, sd, &state, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN);
+       shader_eval_surface(kg, sd, &rng, &state, rbsdf, state.flag, 
SHADER_CONTEXT_MAIN);
 
        /* TODO, disable the closures we won't need */
 
@@ -220,6 +220,7 @@ ccl_device_inline float3 
kernel_bake_shader_bsdf(KernelGlobals *kg,
 
 ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
                                                        ShaderData *sd,
+                                                       RNG *rng,
                                                        PathState *state,
                                                        float3 direct,
                                                        float3 indirect,
@@ -239,12 +240,12 @@ ccl_device float3 
kernel_bake_evaluate_direct_indirect(KernelGlobals *kg,
                }
                else {
                        /* surface color of the pass only */
-                       shader_eval_surface(kg, sd, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
+                       shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
                        return kernel_bake_shader_bsdf(kg, sd, type);
                }
        }
        else {
-               shader_eval_surface(kg, sd, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
+               shader_eval_surface(kg, sd, rng, state, 0.0f, 0, 
SHADER_CONTEXT_MAIN);
                color = kernel_bake_shader_bsdf(kg, sd, type);
        }
 
@@ -336,7 +337,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_global uint4 *input,
                case SHADER_EVAL_NORMAL:
                {
                        if((sd.flag & SD_HAS_BUMP)) {
-                               shader_eval_surface(kg, &sd, &state, 0.f, 0, 
SHADER_CONTEXT_MAIN);
+                               shader_eval_surface(kg, &sd, &rng, &state, 0.f, 
0, SHADER_CONTEXT_MAIN);
                        }
 
                        /* compression: normal = (2 * color) - 1 */
@@ -350,7 +351,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_global uint4 *input,
                }
                case SHADER_EVAL_EMISSION:
                {
-                       shader_eval_surface(kg, &sd, &state, 0.f, 0, 
SHADER_CONTEXT_EMISSION);
+                       shader_eval_surface(kg, &sd, &rng, &state, 0.f, 0, 
SHADER_CONTEXT_EMISSION);
                        out = shader_emissive_eval(kg, &sd);
                        break;
                }
@@ -403,6 +404,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, 
ccl_global uint4 *input,
                {
                        out = kernel_bake_

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to