Commit: d93f680db9acaaade0354b34857a3ccaf348557f
Author: Pascal Schoen
Date:   Mon Oct 24 09:14:51 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rBd93f680db9acaaade0354b34857a3ccaf348557f

Added subsurface radius parameter to control the per color channel
effection radius of the subsurface scattering.

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

M       intern/cycles/kernel/shaders/node_disney_bsdf.osl
M       intern/cycles/kernel/svm/svm_closure.h
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/nodes.h
M       source/blender/nodes/shader/nodes/node_shader_bsdf_disney.c

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

diff --git a/intern/cycles/kernel/shaders/node_disney_bsdf.osl 
b/intern/cycles/kernel/shaders/node_disney_bsdf.osl
index 00c6008..b4a9722 100644
--- a/intern/cycles/kernel/shaders/node_disney_bsdf.osl
+++ b/intern/cycles/kernel/shaders/node_disney_bsdf.osl
@@ -21,6 +21,7 @@ shader node_disney_bsdf(
     string distribution = "Multiscatter GGX",
     color BaseColor = color(0.8, 0.8, 0.8),
     float Subsurface = 0.0,
+    vector SubsurfaceRadius = vector(1.0, 1.0, 1.0),
     color SubsurfaceColor = color(0.7, 0.1, 0.1),
     float Metallic = 0.0,
     float Specular = 0.5,
@@ -53,7 +54,7 @@ shader node_disney_bsdf(
     
     if (diffuse_weight > 1e-5) {
         if (Subsurface > 1e-5) {
-            BSDF = bssrdf_disney(Normal, vector(Subsurface, Subsurface, 
Subsurface), 0.0, BaseColor, SubsurfaceColor, Roughness);
+            BSDF = bssrdf_disney(Normal, Subsurface * SubsurfaceRadius, 0.0, 
BaseColor, SubsurfaceColor, Roughness);
         } else {
             BSDF = disney_diffuse(Normal, BaseColor, Roughness);
         }
diff --git a/intern/cycles/kernel/svm/svm_closure.h 
b/intern/cycles/kernel/svm/svm_closure.h
index 93fe99c..a9ba922 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -127,9 +127,10 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                        float3 base_color = stack_valid(data_base_color.x) ? 
stack_load_float3(stack, data_base_color.x) :
                                make_float3(__uint_as_float(data_base_color.y), 
__uint_as_float(data_base_color.z), __uint_as_float(data_base_color.w));
 
-                       // get the additional clearcoat normal
-                       uint4 data_clearcoat_normal = read_node(kg, offset);
-                       float3 CN = stack_valid(data_clearcoat_normal.x) ? 
stack_load_float3(stack, data_clearcoat_normal.x) : ccl_fetch(sd, N);
+                       // get the additional clearcoat normal and subsurface 
scattering radius
+                       uint4 data_cn_ssr = read_node(kg, offset);
+                       float3 CN = stack_valid(data_cn_ssr.x) ? 
stack_load_float3(stack, data_cn_ssr.x) : ccl_fetch(sd, N);
+                       float3 subsurface_radius = stack_valid(data_cn_ssr.y) ? 
stack_load_float3(stack, data_cn_ssr.y) : make_float3(1.0f, 1.0f, 1.0f);
 
                        // get the subsurface color
                        uint4 data_subsurface_color = read_node(kg, offset);
@@ -168,7 +169,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                        }
                        else if(subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF) {
                                /* radius * scale */
-                               float3 radius = make_float3(1.0f, 1.0f, 1.0f) * 
subsurface;
+                               float3 radius = subsurface_radius * subsurface;
                                /* sharpness */
                                float sharpness = 0.0f;
                                /* texture color blur */
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index f67413e..cefb1a1 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -2233,6 +2233,7 @@ NODE_DEFINE(DisneyBsdfNode)
        SOCKET_IN_COLOR(subsurface_color, "Subsurface Color", make_float3(0.8f, 
0.8f, 0.8f));
        SOCKET_IN_FLOAT(metallic, "Metallic", 0.0f);
        SOCKET_IN_FLOAT(subsurface, "Subsurface", 0.0f);
+       SOCKET_IN_VECTOR(subsurface_radius, "Subsurface Radius", 
make_float3(0.1f, 0.1f, 0.1f));
        SOCKET_IN_FLOAT(specular, "Specular", 0.0f);
        SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
        SOCKET_IN_FLOAT(specular_tint, "Specular Tint", 0.0f);
@@ -2264,7 +2265,7 @@ DisneyBsdfNode::DisneyBsdfNode()
        distribution_orig = NBUILTIN_CLOSURES;
 }
 
-void DisneyBsdfNode::compile(SVMCompiler& compiler, ShaderInput *p_metallic, 
ShaderInput *p_subsurface,
+void DisneyBsdfNode::compile(SVMCompiler& compiler, ShaderInput *p_metallic, 
ShaderInput *p_subsurface, ShaderInput *p_subsurface_radius,
        ShaderInput *p_specular, ShaderInput *p_roughness, ShaderInput 
*p_specular_tint, ShaderInput *p_anisotropic,
        ShaderInput *p_sheen, ShaderInput *p_sheen_tint, ShaderInput 
*p_clearcoat, ShaderInput *p_clearcoat_gloss,
        ShaderInput *p_ior, ShaderInput *p_transparency, ShaderInput 
*p_anisotropic_rotation, ShaderInput *p_refraction_roughness)
@@ -2294,6 +2295,7 @@ void DisneyBsdfNode::compile(SVMCompiler& compiler, 
ShaderInput *p_metallic, Sha
        int transparency_offset = compiler.stack_assign(p_transparency);
        int refraction_roughness_offset = 
compiler.stack_assign(p_refraction_roughness);
        int anisotropic_rotation_offset = 
compiler.stack_assign(p_anisotropic_rotation);
+       int subsurface_radius_offset = 
compiler.stack_assign(p_subsurface_radius);
 
        compiler.add_node(NODE_CLOSURE_BSDF,
                compiler.encode_uchar4(closure,
@@ -2315,7 +2317,7 @@ void DisneyBsdfNode::compile(SVMCompiler& compiler, 
ShaderInput *p_metallic, Sha
        compiler.add_node(((base_color_in->link) ? 
compiler.stack_assign(base_color_in) : SVM_STACK_INVALID),
                __float_as_int(bc_default.x), __float_as_int(bc_default.y), 
__float_as_int(bc_default.z));
 
-       compiler.add_node(clearcoat_normal_offset, SVM_STACK_INVALID, 
SVM_STACK_INVALID, SVM_STACK_INVALID);
+       compiler.add_node(clearcoat_normal_offset, subsurface_radius_offset, 
SVM_STACK_INVALID, SVM_STACK_INVALID);
 
        float3 ss_default = get_float3(subsurface_color_in->socket_type);
 
@@ -2331,8 +2333,8 @@ bool DisneyBsdfNode::has_integrator_dependency()
 
 void DisneyBsdfNode::compile(SVMCompiler& compiler)
 {
-       compile(compiler, input("Metallic"), input("Subsurface"), 
input("Specular"), input("Roughness"),
-               input("Specular Tint"), input("Anisotropic"), input("Sheen"), 
input("Sheen Tint"),
+       compile(compiler, input("Metallic"), input("Subsurface"), 
input("Subsurface Radius"), input("Specular"),
+               input("Roughness"), input("Specular Tint"), 
input("Anisotropic"), input("Sheen"), input("Sheen Tint"),
                input("Clearcoat"), input("Clearcoat Gloss"), input("IOR"), 
input("Transparency"),
                input("Anisotropic Rotation"), input("Refraction Roughness"));
 }
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index b071900..dd43d8c 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -369,13 +369,13 @@ public:
        bool has_spatial_varying() { return true; }
        bool has_surface_bssrdf() { return true; }
        bool has_bssrdf_bump();
-       void compile(SVMCompiler& compiler, ShaderInput *metallic, ShaderInput 
*subsurface,
+       void compile(SVMCompiler& compiler, ShaderInput *metallic, ShaderInput 
*subsurface, ShaderInput *subsurface_radius,
                ShaderInput *specular, ShaderInput *roughness, ShaderInput 
*specular_tint, ShaderInput *anisotropic,
                ShaderInput *sheen, ShaderInput *sheen_tint, ShaderInput 
*clearcoat, ShaderInput *clearcoat_gloss,
                ShaderInput *ior, ShaderInput *transparency, ShaderInput 
*anisotropic_rotation, ShaderInput *refraction_roughness);
 
        float3 base_color;
-       float3 subsurface_color;
+       float3 subsurface_color, subsurface_radius;
        float metallic, subsurface, specular, roughness, specular_tint, 
anisotropic,
                sheen, sheen_tint, clearcoat, clearcoat_gloss, ior, 
transparency,
                anisotropic_rotation, refraction_roughness;
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_disney.c 
b/source/blender/nodes/shader/nodes/node_shader_bsdf_disney.c
index adb82cc..0157173 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_disney.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_disney.c
@@ -32,6 +32,7 @@
 static bNodeSocketTemplate sh_node_bsdf_disney_in[] = {
        {       SOCK_RGBA, 1, N_("Base Color"),                 0.8f, 0.8f, 
0.8f, 1.0f, 0.0f, 1.0f},
        {       SOCK_FLOAT, 1, N_("Subsurface"),                0.0f, 0.0f, 
0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+       {       SOCK_VECTOR, 1, N_("Subsurface Radius"),    1.0f, 1.0f, 1.0f, 
0.0f, 0.0f, 100.0f},
        {       SOCK_RGBA, 1, N_("Subsurface Color"),           0.7f, 0.1f, 
0.1f, 1.0f, 0.0f, 1.0f},
        {       SOCK_FLOAT, 1, N_("Metallic"),              0.0f, 0.0f, 0.0f, 
0.0f, 0.0f, 1.0f, PROP_FACTOR},
        {       SOCK_FLOAT, 1, N_("Specular"),              0.5f, 0.0f, 0.0f, 
0.0f, 0.0f, 1.0f, PROP_FACTOR},

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

Reply via email to