Commit: 02c315aeb0f0d7bb429d4396912e03dbb8a77340
Author: Pascal Schoen
Date:   Tue Sep 6 15:16:09 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB02c315aeb0f0d7bb429d4396912e03dbb8a77340

Implemented the OSL part of the Disney shader

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

M       intern/cycles/kernel/closure/bsdf_disney_sheen.h
M       intern/cycles/kernel/osl/osl_bssrdf.cpp
M       intern/cycles/kernel/osl/osl_closures.cpp
M       intern/cycles/kernel/osl/osl_closures.h
M       intern/cycles/kernel/shaders/node_disney_bsdf.osl
M       intern/cycles/kernel/shaders/stdosl.h
M       source/blender/gpu/shaders/gpu_shader_material.glsl

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

diff --git a/intern/cycles/kernel/closure/bsdf_disney_sheen.h 
b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
index 478ecab..9e25794 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_sheen.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
@@ -133,7 +133,7 @@ ccl_device int bsdf_disney_sheen_sample(const ShaderClosure 
*sc,
        else {
                *pdf = 0;
        }
-       return LABEL_DIFFUSE;
+       return LABEL_REFLECT|LABEL_DIFFUSE;
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/osl_bssrdf.cpp 
b/intern/cycles/kernel/osl/osl_bssrdf.cpp
index b76f2b4..3f944c4 100644
--- a/intern/cycles/kernel/osl/osl_bssrdf.cpp
+++ b/intern/cycles/kernel/osl/osl_bssrdf.cpp
@@ -80,6 +80,8 @@ public:
                                bssrdf->albedo = albedo.x;
                                bssrdf->sharpness = sharpness;
                                bssrdf->N = params.N;
+                               bssrdf->baseColor = params.baseColor;
+                               bssrdf->roughness = params.roughness;
                                ccl_fetch(sd, flag) |= bssrdf_setup(bssrdf, 
(ClosureType)type);
                        }
 
@@ -91,6 +93,8 @@ public:
                                bssrdf->albedo = albedo.y;
                                bssrdf->sharpness = sharpness;
                                bssrdf->N = params.N;
+                               bssrdf->baseColor = params.baseColor;
+                               bssrdf->roughness = params.roughness;
                                ccl_fetch(sd, flag) |= bssrdf_setup(bssrdf, 
(ClosureType)type);
                        }
 
@@ -102,6 +106,8 @@ public:
                                bssrdf->albedo = albedo.z;
                                bssrdf->sharpness = sharpness;
                                bssrdf->N = params.N;
+                               bssrdf->baseColor = params.baseColor;
+                               bssrdf->roughness = params.roughness;
                                ccl_fetch(sd, flag) |= bssrdf_setup(bssrdf, 
(ClosureType)type);
                        }
                }
@@ -182,5 +188,32 @@ ClosureParam *closure_bssrdf_burley_params()
 
 CCLOSURE_PREPARE(closure_bssrdf_burley_prepare, BurleyBSSRDFClosure)
 
+/* Disney */
+
+class DisneyBSSRDFClosure : public CBSSRDFClosure {
+public:
+       void setup(ShaderData *sd, int path_flag, float3 weight)
+       {
+               alloc(sd, path_flag, weight, CLOSURE_BSSRDF_DISNEY_ID);
+       }
+};
+
+ClosureParam *closure_bssrdf_disney_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(DisneyBSSRDFClosure, params.N),
+               CLOSURE_FLOAT3_PARAM(DisneyBSSRDFClosure, radius),
+               CLOSURE_FLOAT_PARAM(DisneyBSSRDFClosure, params.texture_blur),
+               CLOSURE_FLOAT3_PARAM(DisneyBSSRDFClosure, params.baseColor),
+               CLOSURE_FLOAT3_PARAM(DisneyBSSRDFClosure, albedo),
+               CLOSURE_FLOAT_PARAM(DisneyBSSRDFClosure, params.roughness),
+               CLOSURE_STRING_KEYPARAM(DisneyBSSRDFClosure, label, "label"),
+               CLOSURE_FINISH_PARAM(DisneyBSSRDFClosure)
+       };
+       return params;
+}
+
+CCLOSURE_PREPARE(closure_bssrdf_disney_prepare, DisneyBSSRDFClosure)
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp 
b/intern/cycles/kernel/osl/osl_closures.cpp
index 2c7772f..2e5e289 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -187,6 +187,7 @@ BSDF_CLOSURE_CLASS_END(DisneyDiffuse, disney_diffuse)
 
 BSDF_CLOSURE_CLASS_BEGIN(DisneySheen, disney_sheen, DisneySheenBsdf, 
LABEL_DIFFUSE)
        CLOSURE_FLOAT3_PARAM(DisneySheenClosure, params.N),
+       CLOSURE_FLOAT3_PARAM(DisneySheenClosure, params.baseColor),
        CLOSURE_FLOAT_PARAM(DisneySheenClosure, params.sheen),
        CLOSURE_FLOAT_PARAM(DisneySheenClosure, params.sheenTint),
 BSDF_CLOSURE_CLASS_END(DisneySheen, disney_sheen)
@@ -455,6 +456,18 @@ void OSLShader::register_closures(OSLShadingSystem *ss_)
                closure_bsdf_microfacet_multi_ggx_glass_params(), 
closure_bsdf_microfacet_multi_ggx_glass_prepare);
        register_closure(ss, "microfacet_multi_ggx_aniso", id++,
                closure_bsdf_microfacet_multi_ggx_aniso_params(), 
closure_bsdf_microfacet_multi_ggx_aniso_prepare);
+       register_closure(ss, "microfacet_ggx_fresnel", id++,
+               closure_bsdf_microfacet_ggx_fresnel_params(), 
closure_bsdf_microfacet_ggx_fresnel_prepare);
+       register_closure(ss, "microfacet_ggx_aniso_fresnel", id++,
+               closure_bsdf_microfacet_ggx_aniso_fresnel_params(), 
closure_bsdf_microfacet_ggx_aniso_fresnel_prepare);
+       register_closure(ss, "microfacet_ggx_refraction_fresnel", id++,
+               closure_bsdf_microfacet_ggx_refraction_fresnel_params(), 
closure_bsdf_microfacet_ggx_refraction_fresnel_prepare);
+       register_closure(ss, "microfacet_multi_ggx_fresnel", id++,
+               closure_bsdf_microfacet_multi_ggx_fresnel_params(), 
closure_bsdf_microfacet_multi_ggx_fresnel_prepare);
+       register_closure(ss, "microfacet_multi_ggx_glass_fresnel", id++,
+               closure_bsdf_microfacet_multi_ggx_glass_fresnel_params(), 
closure_bsdf_microfacet_multi_ggx_glass_fresnel_prepare);
+       register_closure(ss, "microfacet_multi_ggx_aniso_fresnel", id++,
+               closure_bsdf_microfacet_multi_ggx_aniso_fresnel_params(), 
closure_bsdf_microfacet_multi_ggx_aniso_fresnel_prepare);
        register_closure(ss, "microfacet_beckmann", id++,
                bsdf_microfacet_beckmann_params(), 
bsdf_microfacet_beckmann_prepare);
        register_closure(ss, "microfacet_beckmann_aniso", id++,
@@ -496,6 +509,8 @@ void OSLShader::register_closures(OSLShadingSystem *ss_)
                closure_bssrdf_gaussian_params(), 
closure_bssrdf_gaussian_prepare);
        register_closure(ss, "bssrdf_burley", id++,
                closure_bssrdf_burley_params(), closure_bssrdf_burley_prepare);
+       register_closure(ss, "bssrdf_disney", id++,
+               closure_bssrdf_disney_params(), closure_bssrdf_disney_prepare);
 
        register_closure(ss, "hair_reflection", id++,
                bsdf_hair_reflection_params(), bsdf_hair_reflection_prepare);
@@ -526,6 +541,112 @@ bool CBSDFClosure::skip(const ShaderData *sd, int 
path_flag, int scattering)
        return false;
 }
 
+
+/* GGX closures with Fresnel */
+
+class MicrofacetFresnelClosure : public CBSDFClosure {
+public:
+       MicrofacetBsdf params;
+       float3 color;
+       float3 cspec0;
+
+       MicrofacetBsdf *alloc(ShaderData *sd, int path_flag, float3 weight)
+       {
+               /* Technically, the MultiGGX Glass closure may also transmit. 
However,
+               * since this is set statically and only used for caustic flags, 
this
+               * is probably as good as it gets. */
+               if (!skip(sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
+                       MicrofacetBsdf *bsdf = 
(MicrofacetBsdf*)bsdf_alloc_osl(sd, sizeof(MicrofacetBsdf), weight, &params);
+                       MicrofacetExtra *extra = 
(MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
+                       if (bsdf && extra) {
+                               bsdf->extra = extra;
+                               bsdf->extra->color = color;
+                               bsdf->extra->cspec0 = cspec0;
+                               return bsdf;
+                       }
+               }
+
+               return NULL;
+       }
+};
+
+class MicrofacetGGXFresnelClosure : public MicrofacetFresnelClosure {
+public:
+       void setup(ShaderData *sd, int path_flag, float3 weight)
+       {
+               MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight);
+               sd->flag |= (bsdf) ? bsdf_microfacet_ggx_setup(bsdf, true) : 0;
+       }
+};
+
+ClosureParam *closure_bsdf_microfacet_ggx_fresnel_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, params.N),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, 
params.alpha_x),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, params.ior),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, color),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, cspec0),
+               CLOSURE_STRING_KEYPARAM(MicrofacetGGXFresnelClosure, label, 
"label"),
+               CLOSURE_FINISH_PARAM(MicrofacetGGXFresnelClosure)
+       };
+       return params;
+}
+CCLOSURE_PREPARE(closure_bsdf_microfacet_ggx_fresnel_prepare, 
MicrofacetGGXFresnelClosure);
+
+class MicrofacetGGXAnisoFresnelClosure : public MicrofacetFresnelClosure {
+public:
+       void setup(ShaderData *sd, int path_flag, float3 weight)
+       {
+               MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight);
+               sd->flag |= (bsdf) ? bsdf_microfacet_ggx_aniso_setup(bsdf, 
true) : 0;
+       }
+};
+
+ClosureParam *closure_bsdf_microfacet_ggx_aniso_fresnel_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, params.N),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, params.T),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, 
params.alpha_x),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, 
params.alpha_y),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, params.ior),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, color),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, cspec0),
+               CLOSURE_STRING_KEYPARAM(MicrofacetGGXFresnelClosure, label, 
"label"),
+               CLOSURE_FINISH_PARAM(MicrofacetGGXFresnelClosure)
+       };
+       return params;
+}
+CCLOSURE_PREPARE(closure_bsdf_microfacet_ggx_aniso_fresnel_prepare, 
MicrofacetGGXAnisoFresnelClosure);
+
+class MicrofacetGGXRefractionFresnelClosure : public MicrofacetFresnelClosure {
+public:
+       MicrofacetGGXRefractionFresnelClosure() : MicrofacetFresnelClosure() {}
+
+       void setup(ShaderData *sd, int path_flag, float3 weight)
+       {
+               MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight);
+               sd->flag |= (bsdf) ? bsdf_microfacet_ggx_refraction_setup(bsdf, 
true) : 0;
+       }
+};
+
+ClosureParam *closure_bsdf_microfacet_ggx_refraction_fresnel_params()
+{
+       static ClosureParam params[] = {
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, params.N),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, 
params.alpha_x),
+               CLOSURE_FLOAT_PARAM(MicrofacetGGXFresnelClosure, params.ior),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, color),
+               CLOSURE_FLOAT3_PARAM(MicrofacetGGXFresnelClosure, cspec0),
+               CLOSURE_STRING_KEYPARAM(MicrofacetGGXFresnelClosure, label, 
"label"),
+               CLOSURE_FINISH_PARAM(MicrofacetGGXFresnelClosure)
+       };
+       return params;
+}
+CCLOSURE_PREPARE(closure_bsdf_microfacet_ggx_refraction_fresnel_prepare, 
MicrofacetGGXRefractionFresnelClosure);
+
+
 /* Multiscattering GGX closures */
 
 class MicrofacetMultiClosure : public CBSDFClosure {
@@ -623,5 +744,110 @@ ClosureParam 
*closure_bsdf_microfacet_multi_ggx_glass_params()
 }
 CCLOSURE_PREPARE(closure_bsdf_microfacet_multi_ggx_glass_prepare, 
MicrofacetMultiGGXGlassClosure);
 
+
+/* Multiscattering GGX closures with Fresnel */
+
+class MicrofacetMultiFresnelClosure : public CBSDFClosure {
+public:
+       MicrofacetBsdf params;
+       float3 color;
+       float3 cspec0;
+
+       MicrofacetBsdf *alloc(ShaderData *sd, int path_flag, float3 weight)
+       {
+               /* Technically, the MultiGGX Glass closure may also transmit. 
However,
+               * since this is set statically and only used for caustic flags, 
this
+               * is probably as good as it gets. */
+               if (!skip(sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
+                       MicrofacetBsdf *bsdf = 
(MicrofacetBsdf*)bsdf_alloc_osl(sd, sizeof(MicrofacetBsdf),

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