[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, ¶m1_offset, ¶m2_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