Thanks for pointing this out, fixed now.
On Wed, Sep 4, 2013 at 11:46 PM, Mitchell Stokes <[email protected]> wrote: > This breaks the GLSL shader. node_subsurface_scattering() no longer defines > N. > > > On Tue, Sep 3, 2013 at 3:39 PM, Brecht Van Lommel < > [email protected]> 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 >> [email protected] >> http://lists.blender.org/mailman/listinfo/bf-blender-cvs >> > _______________________________________________ > Bf-committers mailing list > [email protected] > http://lists.blender.org/mailman/listinfo/bf-committers _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
