[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59783] trunk/blender: Cycles: add a sharpness input to the Cubic SSS falloff.

Mitchell Stokes mogurijin at gmail.com
Wed Sep 4 23:46:13 CEST 2013


This breaks the GLSL shader. node_subsurface_scattering() no longer defines
N.


On Tue, Sep 3, 2013 at 3:39 PM, Brecht Van Lommel <
brechtvanlommel at pandora.be> wrote:

> Revision: 59783
>
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59783
> Author:   blendix
> Date:     2013-09-03 22:39:17 +0000 (Tue, 03 Sep 2013)
> Log Message:
> -----------
> Cycles: add a sharpness input to the Cubic SSS falloff. When set to 1 this
> will
> give a result more similar to the Compatible falloff option. The scale is
> x2
> though to keep the perceived scatter radius roughly the same while
> changing the
> sharpness. Difference with compatible will be mainly on non-flat geometry.
>
> Modified Paths:
> --------------
>     trunk/blender/intern/cycles/kernel/closure/bssrdf.h
>     trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.cpp
>     trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.h
>     trunk/blender/intern/cycles/kernel/osl/osl_closures.cpp
>     trunk/blender/intern/cycles/kernel/osl/osl_closures.h
>     trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
>
> trunk/blender/intern/cycles/kernel/shaders/node_subsurface_scattering.osl
>     trunk/blender/intern/cycles/kernel/shaders/stdosl.h
>     trunk/blender/intern/cycles/kernel/svm/svm_closure.h
>     trunk/blender/intern/cycles/render/nodes.cpp
>     trunk/blender/intern/cycles/render/nodes.h
>     trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl
>     trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
>
> trunk/blender/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.c
>
> Modified: trunk/blender/intern/cycles/kernel/closure/bssrdf.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/closure/bssrdf.h 2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/closure/bssrdf.h 2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -31,6 +31,7 @@
>         }
>         else {
>                 sc->data1 = clamp(sc->data1, 0.0f, 1.0f); /* texture blur
> */
> +               sc->T.x = clamp(sc->T.x, 0.0f, 1.0f); /* sharpness */
>                 sc->type = type;
>
>                 return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSSRDF;
> @@ -95,17 +96,49 @@
>
>  __device float bssrdf_cubic_eval(ShaderClosure *sc, float r)
>  {
> -       const float Rm = sc->data0;
> +       const float sharpness = sc->T.x;
>
> -       if(r >= Rm)
> -               return 0.0f;
> -
> -       /* integrate (2*pi*r * 10*(R - r)^3)/(pi * R^5) from 0 to R = 1 */
> -       const float Rm5 = (Rm*Rm) * (Rm*Rm) * Rm;
> -       const float f = Rm - min(r, Rm);
> -       const float f3 = f*f*f;
> +       if(sharpness == 0.0f) {
> +               const float Rm = sc->data0;
>
> -       return (f3 * 10.0f) / (Rm5 * M_PI_F);
> +               if(r >= Rm)
> +                       return 0.0f;
> +
> +               /* integrate (2*pi*r * 10*(R - r)^3)/(pi * R^5) from 0 to
> R = 1 */
> +               const float Rm5 = (Rm*Rm) * (Rm*Rm) * Rm;
> +               const float f = Rm - r;
> +               const float num = f*f*f;
> +
> +               return (10.0f * num) / (Rm5 * M_PI_F);
> +
> +       }
> +       else {
> +               float Rm = sc->data0*(1.0f + sharpness);
> +
> +               if(r >= Rm)
> +                       return 0.0f;
> +
> +               /* custom variation with extra sharpness, to match the
> previous code */
> +               const float y = 1.0f/(1.0f + sharpness);
> +               float Rmy, ry, ryinv;
> +
> +               if(sharpness == 1.0f) {
> +                       Rmy = sqrtf(Rm);
> +                       ry = sqrtf(r);
> +                       ryinv = (ry > 0.0f)? 1.0f/ry: 0.0f;
> +               }
> +               else {
> +                       Rmy = powf(Rm, y);
> +                       ry = powf(r, y);
> +                       ryinv = (r > 0.0f)? powf(r, 2.0f*y - 2.0f): 0.0f;
> +               }
> +
> +               const float Rmy5 = (Rmy*Rmy) * (Rmy*Rmy) * Rmy;
> +               const float f = Rmy - ry;
> +               const float num = f*(f*f)*(y*ryinv);
> +
> +               return (10.0f * num) / (Rmy5 * M_PI_F);
> +       }
>  }
>
>  __device float bssrdf_cubic_pdf(ShaderClosure *sc, float r)
> @@ -143,9 +176,16 @@
>
>  __device void bssrdf_cubic_sample(ShaderClosure *sc, float xi, float *r,
> float *h)
>  {
> -       const float Rm = sc->data0;
> -       const float r_ = bssrdf_cubic_quintic_root_find(xi) * Rm;
> +       float Rm = sc->data0;
> +       float r_ = bssrdf_cubic_quintic_root_find(xi);
>
> +       const float sharpness = sc->T.x;
> +       if(sharpness != 0.0f) {
> +               r_ = powf(r_, 1.0f + sharpness);
> +               Rm *= (1.0f + sharpness);
> +       }
> +
> +       r_ *= Rm;
>         *r = r_;
>
>         /* h^2 + r^2 = Rm^2 */
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.cpp       2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.cpp       2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -56,10 +56,8 @@
>
>         void setup()
>         {
> -               sc.type = CLOSURE_BSSRDF_COMPATIBLE_ID;
> -               sc.prim = NULL;
> +               sc.type = CLOSURE_BSSRDF_CUBIC_ID;
>                 sc.data0 = fabsf(average(radius));
> -               sc.data1 = 0.0f; // XXX texture blur
>         }
>
>         bool mergeable(const ClosurePrimitive *other) const
> @@ -85,6 +83,19 @@
>         return params;
>  }
>
> +ClosureParam *closure_bssrdf_cubic_extended_params()
> +{
> +       static ClosureParam params[] = {
> +               CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, sc.N),
> +               CLOSURE_FLOAT3_PARAM(CubicBSSRDFClosure, radius),
> +               CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.data1),
> +               CLOSURE_FLOAT_PARAM(CubicBSSRDFClosure, sc.T.x),
> +           CLOSURE_STRING_KEYPARAM("label"),
> +           CLOSURE_FINISH_PARAM(CubicBSSRDFClosure)
> +       };
> +       return params;
> +}
> +
>  CLOSURE_PREPARE(closure_bssrdf_cubic_prepare, CubicBSSRDFClosure)
>
>  /* Gaussian */
> @@ -97,9 +108,7 @@
>         void setup()
>         {
>                 sc.type = CLOSURE_BSSRDF_GAUSSIAN_ID;
> -               sc.prim = NULL;
>                 sc.data0 = fabsf(average(radius));
> -               sc.data1 = 0.0f; // XXX texture blurring!
>         }
>
>         bool mergeable(const ClosurePrimitive *other) const
> @@ -125,6 +134,18 @@
>         return params;
>  }
>
> +ClosureParam *closure_bssrdf_gaussian_extended_params()
> +{
> +       static ClosureParam params[] = {
> +               CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, sc.N),
> +               CLOSURE_FLOAT3_PARAM(GaussianBSSRDFClosure, radius),
> +               CLOSURE_FLOAT_PARAM(GaussianBSSRDFClosure, sc.data1),
> +           CLOSURE_STRING_KEYPARAM("label"),
> +           CLOSURE_FINISH_PARAM(GaussianBSSRDFClosure)
> +       };
> +       return params;
> +}
> +
>  CLOSURE_PREPARE(closure_bssrdf_gaussian_prepare, GaussianBSSRDFClosure)
>
>  CCL_NAMESPACE_END
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.h 2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_bssrdf.h 2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -48,7 +48,7 @@
>         ShaderClosure sc;
>         float3 radius;
>
> -       CBSSRDFClosure() : OSL::ClosurePrimitive(BSSRDF) { }
> +       CBSSRDFClosure() : OSL::ClosurePrimitive(BSSRDF) { memset(&sc, 0,
> sizeof(sc)); }
>         ~CBSSRDFClosure() { }
>
>         int scattering() const { return LABEL_DIFFUSE; }
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_closures.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_closures.cpp     2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_closures.cpp     2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -221,6 +221,10 @@
>                 closure_bssrdf_cubic_params(),
> closure_bssrdf_cubic_prepare);
>         register_closure(ss, "bssrdf_gaussian", id++,
>                 closure_bssrdf_gaussian_params(),
> closure_bssrdf_gaussian_prepare);
> +       register_closure(ss, "bssrdf_cubic", id++,
> +               closure_bssrdf_cubic_extended_params(),
> closure_bssrdf_cubic_prepare);
> +       register_closure(ss, "bssrdf_gaussian", id++,
> +               closure_bssrdf_gaussian_extended_params(),
> closure_bssrdf_gaussian_prepare);
>  }
>
>  CCL_NAMESPACE_END
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_closures.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_closures.h       2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_closures.h       2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -52,6 +52,8 @@
>  OSL::ClosureParam *closure_westin_sheen_params();
>  OSL::ClosureParam *closure_bssrdf_cubic_params();
>  OSL::ClosureParam *closure_bssrdf_gaussian_params();
> +OSL::ClosureParam *closure_bssrdf_cubic_extended_params();
> +OSL::ClosureParam *closure_bssrdf_gaussian_extended_params();
>
>  void closure_emission_prepare(OSL::RendererServices *, int id, void
> *data);
>  void closure_background_prepare(OSL::RendererServices *, int id, void
> *data);
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp       2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp       2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -239,6 +239,7 @@
>                                                 sc.type = bssrdf->sc.type;
>                                                 sc.N = bssrdf->sc.N;
>                                                 sc.data1 =
> bssrdf->sc.data1;
> +                                               sc.T.x = bssrdf->sc.T.x;
>                                                 sc.prim = NULL;
>
>                                                 /* disable in case of
> diffuse ancestor, can't see it well then and
>
> Modified:
> trunk/blender/intern/cycles/kernel/shaders/node_subsurface_scattering.osl
> ===================================================================
> ---
> trunk/blender/intern/cycles/kernel/shaders/node_subsurface_scattering.osl
> 2013-09-03 22:32:03 UTC (rev 59782)
> +++
> trunk/blender/intern/cycles/kernel/shaders/node_subsurface_scattering.osl
> 2013-09-03 22:39:17 UTC (rev 59783)
> @@ -20,14 +20,15 @@
>         color Color = 0.8,
>         float Scale = 1.0,
>         vector Radius = vector(0.1, 0.1, 0.1),
> -       float TextureBlur = 0.0, // XXX use
> +       float TextureBlur = 0.0,
> +       float Sharpness = 0.0,
>         string Falloff = "Cubic",
>         normal Normal = N,
>         output closure color BSSRDF = 0)
>  {
>         if(Falloff == "Gaussian")
> -               BSSRDF = Color * bssrdf_gaussian(N, Scale * Radius);
> -       else /* Cubic, hardcoded to compatible closure for now */
> -               BSSRDF = Color * bssrdf_cubic(N, Scale * Radius);
> +               BSSRDF = Color * bssrdf_gaussian(N, Scale * Radius,
> TextureBlur);
> +       else
> +               BSSRDF = Color * bssrdf_cubic(N, Scale * Radius,
> TextureBlur, Sharpness);
>  }
>
>
> Modified: trunk/blender/intern/cycles/kernel/shaders/stdosl.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/shaders/stdosl.h 2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/shaders/stdosl.h 2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -465,11 +465,12 @@
>  closure color ambient_occlusion() BUILTIN;
>
>  // BSSRDF
> +closure color bssrdf_cubic(normal N, vector radius, float texture_blur,
> float sharpness) BUILTIN;
> +closure color bssrdf_gaussian(normal N, vector radius, float
> texture_blur) BUILTIN;
> +
> +// Backwards compatibility
>  closure color bssrdf_cubic(normal N, vector radius) BUILTIN;
>  closure color bssrdf_gaussian(normal N, vector radius) BUILTIN;
> -
> -// Backwards compatibility
> -
>  closure color specular_toon(normal N, float size, float smooth) BUILTIN;
>
>  // Renderer state
>
> Modified: trunk/blender/intern/cycles/kernel/svm/svm_closure.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/svm/svm_closure.h        2013-09-03
> 22:32:03 UTC (rev 59782)
> +++ trunk/blender/intern/cycles/kernel/svm/svm_closure.h        2013-09-03
> 22:39:17 UTC (rev 59783)
> @@ -108,13 +108,13 @@
>         if(mix_weight == 0.0f)
>                 return;
>
> -       float3 N = stack_valid(data_node.y)? stack_load_float3(stack,
> data_node.y): sd->N;
> +       float3 N = stack_valid(data_node.x)? stack_load_float3(stack,
> data_node.x): sd->N;
>  #else
>         decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset,
> NULL);
>         float mix_weight = 1.0f;
>
>         uint4 data_node = read_node(kg, offset);
> -       float3 N = stack_valid(data_node.y)? stack_load_float3(stack,
> data_node.y): sd->N;
> +       float3 N = stack_valid(data_node.x)? stack_load_float3(stack,
> data_node.x): sd->N;
>  #endif
>
>         float param1 = (stack_valid(param1_offset))?
> stack_load_float(stack, param1_offset): __uint_as_float(node.z);
> @@ -279,10 +279,10 @@
>                                 sc->N = N;
>
>  #ifdef __ANISOTROPIC__
> -                               sc->T = stack_load_float3(stack,
> data_node.z);
> +                               sc->T = stack_load_float3(stack,
> data_node.y);
>
>                                 /* rotate tangent */
> -                               float rotation = stack_load_float(stack,
> data_node.w);
> +                               float rotation = stack_load_float(stack,
> data_node.z);
>
>                                 if(rotation != 0.0f)
>                                         sc->T = rotate_around_axis(sc->T,
> sc->N, rotation * M_2PI_F);
> @@ -353,7 +353,9 @@
>
>                         if(sample_weight > 1e-5f && sd->num_closure+2 <
> MAX_CLOSURE) {
>                                 /* radius * scale */
> -                               float3 radius = stack_load_float3(stack,
> data_node.w)*param1;
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list