Commit: b3ca6d8a2f4f866b323fc2df0a3beff577218c27
Author: Pascal Schoen
Date:   Tue Jul 26 12:30:25 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rBb3ca6d8a2f4f866b323fc2df0a3beff577218c27

Improvement of the SSS in the Disney shader

 * Now the bump normal is correctly used for the SSS.
 * SSS in Disney uses the Disney diffuse shader

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

M       intern/cycles/kernel/closure/bsdf.h
M       intern/cycles/kernel/closure/bssrdf.h
M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/osl/osl_bssrdf.cpp
M       intern/cycles/kernel/osl/osl_shader.cpp
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/render/nodes.h

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

diff --git a/intern/cycles/kernel/closure/bsdf.h 
b/intern/cycles/kernel/closure/bsdf.h
index 8ede88f..1f225e1 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -121,6 +121,7 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const 
ShaderData *sd, const Shader
                                eval, omega_in, &domega_in->dx, &domega_in->dy, 
pdf);
                        break;
                case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+               case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
                        label = bsdf_disney_diffuse_sample(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;
@@ -217,6 +218,7 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                                eval = bsdf_hair_transmission_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+                       case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
                                eval = bsdf_disney_diffuse_eval_reflect(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_DISNEY_SHEEN_ID:
@@ -291,6 +293,7 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const 
ShaderData *sd, const Shade
                                eval = bsdf_hair_transmission_eval_transmit(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+                       case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
                                eval = bsdf_disney_diffuse_eval_transmit(sc, 
ccl_fetch(sd, I), omega_in, pdf);
                                break;
                        case CLOSURE_BSDF_DISNEY_SHEEN_ID:
diff --git a/intern/cycles/kernel/closure/bssrdf.h 
b/intern/cycles/kernel/closure/bssrdf.h
index c24720c..a192084 100644
--- a/intern/cycles/kernel/closure/bssrdf.h
+++ b/intern/cycles/kernel/closure/bssrdf.h
@@ -329,10 +329,20 @@ ccl_device int bssrdf_setup(ShaderClosure *sc, 
ClosureType type)
 {
        if(sc->data0 < BSSRDF_MIN_RADIUS) {
                /* revert to diffuse BSDF if radius too small */
-               sc->data0 = 0.0f;
-               sc->data1 = 0.0f;
-               int flag = bsdf_diffuse_setup(sc);
-               sc->type = CLOSURE_BSDF_BSSRDF_ID;
+               int flag;
+               if (type == CLOSURE_BSSRDF_DISNEY_ID) {
+                       sc->data0 = sc->data3;
+                       sc->data1 = 0.0f;
+                       flag = bsdf_disney_diffuse_setup(sc);
+                       sc->type = CLOSURE_BSDF_BSSRDF_DISNEY_ID;
+               }
+               else {
+                       sc->data0 = 0.0f;
+                       sc->data1 = 0.0f;
+                       flag = bsdf_diffuse_setup(sc);
+                       sc->type = CLOSURE_BSDF_BSSRDF_ID;
+               }
+               
                return flag;
        }
        else {
@@ -340,7 +350,7 @@ ccl_device int bssrdf_setup(ShaderClosure *sc, ClosureType 
type)
                sc->T.x = saturate(sc->T.x); /* sharpness */
                sc->type = type;
 
-               if(type == CLOSURE_BSSRDF_BURLEY_ID) {
+               if (type == CLOSURE_BSSRDF_BURLEY_ID || type == 
CLOSURE_BSSRDF_DISNEY_ID) {
                        bssrdf_burley_setup(sc);
                }
 
@@ -354,7 +364,7 @@ ccl_device void bssrdf_sample(ShaderClosure *sc, float xi, 
float *r, float *h)
                bssrdf_cubic_sample(sc, xi, r, h);
        else if(sc->type == CLOSURE_BSSRDF_GAUSSIAN_ID)
                bssrdf_gaussian_sample(sc, xi, r, h);
-       else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID)*/
+       else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID || sc->type == 
CLOSURE_BSSRDF_DISNEY_ID)*/
                bssrdf_burley_sample(sc, xi, r, h);
 }
 
@@ -364,7 +374,7 @@ ccl_device float bssrdf_pdf(ShaderClosure *sc, float r)
                return bssrdf_cubic_pdf(sc, r);
        else if(sc->type == CLOSURE_BSSRDF_GAUSSIAN_ID)
                return bssrdf_gaussian_pdf(sc, r);
-       else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID)*/
+       else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID || sc->type == 
CLOSURE_BSSRDF_DISNEY_ID)*/
                return bssrdf_burley_pdf(sc, r);
 }
 
diff --git a/intern/cycles/kernel/kernel_subsurface.h 
b/intern/cycles/kernel/kernel_subsurface.h
index 705b57b..f64b347 100644
--- a/intern/cycles/kernel/kernel_subsurface.h
+++ b/intern/cycles/kernel/kernel_subsurface.h
@@ -147,14 +147,24 @@ ccl_device void 
subsurface_scatter_setup_diffuse_bsdf(ShaderData *sd, float3 wei
 
                sc->weight = weight;
                sc->sample_weight = 1.0f;
-               sc->data0 = 0.0f;
-               sc->data1 = 0.0f;
                sc->N = N;
-               sd->flag |= bsdf_diffuse_setup(sc);
+               if (sc->type == CLOSURE_BSSRDF_DISNEY_ID) {
+                       sc->data0 = sc->data3;
+                       sd->flag |= bsdf_disney_diffuse_setup(sc);
 
-               /* replace CLOSURE_BSDF_DIFFUSE_ID with this special ID so 
render passes
-                * can recognize it as not being a regular diffuse closure */
-               sc->type = CLOSURE_BSDF_BSSRDF_ID;
+                       /* replace CLOSURE_BSDF_DISNEY_DIFFUSE_ID with this 
special ID so render passes
+                       * can recognize it as not being a regular Disney 
diffuse closure */
+                       sc->type = CLOSURE_BSDF_BSSRDF_DISNEY_ID;
+               }
+               else {
+                       sc->data0 = 0.0f;
+                       sc->data1 = 0.0f;
+                       sd->flag |= bsdf_diffuse_setup(sc);
+
+                       /* replace CLOSURE_BSDF_DIFFUSE_ID with this special ID 
so render passes
+                       * can recognize it as not being a regular diffuse 
closure */
+                       sc->type = CLOSURE_BSDF_BSSRDF_ID;
+               }
        }
        else
                sd->num_closure = 0;
diff --git a/intern/cycles/kernel/osl/osl_bssrdf.cpp 
b/intern/cycles/kernel/osl/osl_bssrdf.cpp
index da4afb1..f528465 100644
--- a/intern/cycles/kernel/osl/osl_bssrdf.cpp
+++ b/intern/cycles/kernel/osl/osl_bssrdf.cpp
@@ -41,7 +41,9 @@
 #include "kernel_types.h"
 #include "kernel_montecarlo.h"
 
+#include "closure/bsdf_util.h"
 #include "closure/bsdf_diffuse.h"
+#include "closure/bsdf_disney_diffuse.h"
 #include "closure/bssrdf.h"
 
 CCL_NAMESPACE_BEGIN
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp 
b/intern/cycles/kernel/osl/osl_shader.cpp
index f58368e..a2f1c31 100644
--- a/intern/cycles/kernel/osl/osl_shader.cpp
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@ -23,7 +23,9 @@
 
 #include "geom/geom_object.h"
 
+#include "closure/bsdf_util.h"
 #include "closure/bsdf_diffuse.h"
+#include "closure/bsdf_disney_diffuse.h"
 #include "closure/bssrdf.h"
 
 #include "osl_bssrdf.h"
@@ -278,7 +280,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, 
int path_flag,
                                                                bssrdf->radius 
= make_float3(0.0f, 0.0f, 0.0f);
 
                                                        float3 albedo =
-                                                               
(bssrdf->sc.type == CLOSURE_BSSRDF_BURLEY_ID)
+                                                               
(bssrdf->sc.type == CLOSURE_BSSRDF_BURLEY_ID || bssrdf->sc.type == 
CLOSURE_BSSRDF_DISNEY_ID)
                                                                        ? 
bssrdf->albedo
                                                                        : 
make_float3(0.0f, 0.0f, 0.0f);
 
diff --git a/intern/cycles/kernel/svm/svm_closure.h 
b/intern/cycles/kernel/svm/svm_closure.h
index 26bde57..9390806 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -193,19 +193,18 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
 
 #ifdef __SUBSURFACE__
                        float3 albedo = baseColor;
-                       float3 subsurf_weight = baseColor * weight * 
saturate(subsurface) * diffuse_weight;
+                       float3 subsurf_weight = weight * diffuse_weight;
                        float subsurf_sample_weight = 
fabsf(average(subsurf_weight));
 
                        /* disable in case of diffuse ancestor, can't see it 
well then and
                         * adds considerably noise due to probabilities of 
continuing path
                         * getting lower and lower */
-                       float radius_weight = 1.0f;
-                       if(path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
-                               radius_weight = 0.0f;
+                       if (path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
+                               subsurface = 0.0f;
 
                        if (subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF && 
ccl_fetch(sd, num_closure) + 2 < MAX_CLOSURE) {
                                /* radius * scale */
-                               float3 radius = make_float3(1.0f, 1.0f, 1.0f) * 
radius_weight;
+                               float3 radius = make_float3(1.0f, 1.0f, 1.0f) * 
subsurface;
                                /* sharpness */
                                float sharpness = 0.0f;
                                /* texture color blur */
@@ -218,12 +217,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                                        sc->data0 = radius.x;
                                        sc->data1 = texture_blur;
                                        sc->data2 = albedo.x;
+                                       sc->data3 = roughness;
                                        sc->T.x = sharpness;
+                                       sc->color0 = baseColor;
 #  ifdef __OSL__
                                        sc->prim = NULL;
 #  endif
                                        sc->N = N;
-                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
 
                                        ccl_fetch(sd, num_closure)++;
                                        sc_next(sc);
@@ -235,12 +236,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                                        sc->data0 = radius.y;
                                        sc->data1 = texture_blur;
                                        sc->data2 = albedo.y;
+                                       sc->data3 = roughness;
                                        sc->T.x = sharpness;
+                                       sc->color0 = baseColor;
 #  ifdef __OSL__
                                        sc->prim = NULL;
 #  endif
                                        sc->N = N;
-                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
 
                                        ccl_fetch(sd, num_closure)++;
                                        sc_next(sc);
@@ -252,23 +255,24 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                                        sc->data0 = radius.z;
                                        sc->data1 = texture_blur;
                                        sc->data2 = albedo.z;
+                                       sc->data3 = roughness;
                                        sc->T.x = sharpness;
+                                       sc->color0 = baseColor;
 #  ifdef __OSL__
                                        sc->prim = NULL;
 #  endif
                                        sc->N = N;
-                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+                                       ccl_fetch(sd, flag) |= bssrdf_setup(sc, 
(ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
 
                                        ccl_fetch(sd, num_closure)++;
                                        sc_next(sc);
                                }
                        }
-#endif
-
+#else
                        /* diffuse */
-                       if ((1.0f - saturate(subsurface)) * diffuse_weight > 
0.0f) {
+                       if (diffuse_weight > 0.0f) {
                                if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
-                                       float3 diff_weight = weight * (1.0f - 
saturate(subsurface)) * diffuse_weight;
+                                       float3 diff_weight = weight * 
diffuse_weight;
                                        float diff_sample_weight = 
fabsf(average(diff_weight));
 
                                        if (diff_sample_weight > 
CLOSURE_WEIGHT_CUTOFF) {
@@ -289,6 +293,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                                        }
                                }
                        }
+#endif
 
             /* sheen */
                        if (diffuse_weight > 0.0f && sheen != 0.0f) {
diff --git a/intern/cycles/kernel/svm/svm_types.h 
b/intern/cycles/kernel/svm/svm_types.h
index 3814093..f69b4cc 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -412,11 +412,13 @@ typedef enum ClosureType {
 
        /* Special cases */
        CLOSURE_BSDF_BSSRDF_ID,
+       CLOSURE_BSDF_BSSRDF_DISNEY_ID,
        CLOSURE_BSDF_TRANSPARENT_ID,
 
        /* BSSRDF */
        CLOSURE_BSSRDF_CUBIC_ID,
        CLOSURE_BSSRDF_GAUSSIAN_ID,
+       CLOSURE_BSSRDF_DISNEY_ID,
        CL

@@ 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