[Bf-blender-cvs] [dd139ea] cycles_disney_brdf: Switched to the improved subsurface scattering from Christensen and Burley
Pascal Schoen
noreply at git.blender.org
Mon May 30 12:43:28 CEST 2016
Commit: dd139ead7e04aa87a894ccf3732cfce711258ff1
Author: Pascal Schoen
Date: Mon May 30 12:40:56 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rBdd139ead7e04aa87a894ccf3732cfce711258ff1
Switched to the improved subsurface scattering from Christensen and
Burley
===================================================================
M intern/cycles/kernel/closure/bsdf_disney_diffuse.h
M intern/cycles/kernel/osl/osl_closures.cpp
M intern/cycles/kernel/shaders/node_disney_bsdf.osl
M intern/cycles/kernel/shaders/stdosl.h
M intern/cycles/kernel/svm/svm_closure.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 7e0b74d..87cb3d3 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -50,20 +50,9 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
float LdotH = dot(L, H);
- float Fd = 0.0f;
float FL = schlick_fresnel(NdotL), FV = schlick_fresnel(NdotV);
-
- if (sc->data0/*subsurface*/ != 1.0f) {
- const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * sc->data1/*roughness*/;
- Fd = lerp(1.0f, Fd90, FL) * lerp(1.0f, Fd90, FV); // (1.0f * (1.0f - FL) + Fd90 * FL) * (1.0f * (1.0f - FV) + Fd90 * FV);
- }
-
- if (sc->data0/*subsurface*/ > 0.0f) {
- float Fss90 = LdotH*LdotH * sc->data1/*roughness*/;
- float Fss = lerp(1.0f, Fss90, FL) * lerp(1.0f, Fss90, FV); // (1.0f * (1.0f - FL) + Fss90 * FL) * (1.0f * (1.0f - FV) + Fss90 * FV);
- float ss = 1.25f * (Fss * (1.0f / (NdotL + NdotV) - 0.5f) + 0.5f);
- Fd = lerp(Fd, ss, sc->data0/*subsurface*/); // (Fd * (1.0f - sc->data0) + ss * sc->data0);
- }
+ const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * sc->data0/*roughness*/;
+ float Fd = lerp(1.0f, Fd90, FL) * lerp(1.0f, Fd90, FV);
float3 value = M_1_PI_F * Fd * sc->color0/*baseColor*/;
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp
index 45fe156..838c651 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -269,8 +269,7 @@ ClosureParam *bsdf_disney_diffuse_params()
static ClosureParam params[] = {
CLOSURE_FLOAT3_PARAM(DisneyDiffuseClosure, sc.N),
CLOSURE_FLOAT3_PARAM(DisneyDiffuseClosure, sc.color0), // base color
- CLOSURE_FLOAT_PARAM(DisneyDiffuseClosure, sc.data0), // subsurface
- CLOSURE_FLOAT_PARAM(DisneyDiffuseClosure, sc.data1), // roughness
+ CLOSURE_FLOAT_PARAM(DisneyDiffuseClosure, sc.data0), // roughness
CLOSURE_STRING_KEYPARAM(DisneyDiffuseClosure, label, "label"),
CLOSURE_FINISH_PARAM(DisneyDiffuseClosure)
};
diff --git a/intern/cycles/kernel/shaders/node_disney_bsdf.osl b/intern/cycles/kernel/shaders/node_disney_bsdf.osl
index e23bf77..8cd80d6 100644
--- a/intern/cycles/kernel/shaders/node_disney_bsdf.osl
+++ b/intern/cycles/kernel/shaders/node_disney_bsdf.osl
@@ -34,7 +34,7 @@ shader node_disney_bsdf(
output closure color BSDF = 0)
{
if (Metallic != 1.0) {
- BSDF = (disney_diffuse(Normal, BaseColor, Subsurface, Roughness)
+ BSDF = (((Subsurface * BaseColor * bssrdf_burley(Normal, vector(1.0, 1.0, 1.0), 0.0, BaseColor)) + disney_diffuse(Normal, BaseColor, Roughness) * (1.0 - Subsurface))
+ disney_sheen(Normal, BaseColor, Sheen, SheenTint)) * (1.0 - Metallic);
}
diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h
index 883edb3..ba88f0f 100644
--- a/intern/cycles/kernel/shaders/stdosl.h
+++ b/intern/cycles/kernel/shaders/stdosl.h
@@ -536,7 +536,7 @@ closure color emission() BUILTIN;
closure color background() BUILTIN;
closure color holdout() BUILTIN;
closure color ambient_occlusion() BUILTIN;
-closure color disney_diffuse(normal N, color baseColor, float subsurface, float roughness) BUILTIN;
+closure color disney_diffuse(normal N, color baseColor, float roughness) BUILTIN;
closure color disney_sheen(normal N, color baseColor, float sheen, float sheenTint) BUILTIN;
closure color disney_specular(normal N, normal T, color baseColor, float metallic, float specular, float specularTint,
float roughness, float anisotropic) BUILTIN;
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index fbfc3f0..381e92a 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -137,8 +137,6 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
switch(type) {
case CLOSURE_BSDF_DISNEY_ID: {
- int num_closure = ccl_fetch(sd, num_closure);
-
uint specular_offset, roughness_offset, specularTint_offset, anisotropic_offset,
sheen_offset, sheenTint_offset, clearcoat_offset, clearcoatGloss_offset;
decode_node_uchar4(data_node.z, &specular_offset, &roughness_offset, &specularTint_offset, &anisotropic_offset);
@@ -158,32 +156,104 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
uint4 data_base_color = read_node(kg, offset);
float3 baseColor = 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));
-
- ShaderClosure *sc = ccl_fetch_array(sd, closure, num_closure);
+
+ ShaderClosure *sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
float3 weight = sc->weight;
float sample_weight = sc->sample_weight;
+ /* subsurface */
+ float3 albedo = baseColor;
+ float3 subsurf_weight = baseColor * sc->weight * mix_weight * subsurface * (1.0f - clamp(metallic, 0.0f, 1.0f));
+ float subsurf_sample_weight = fabsf(average(subsurf_weight));
+
+ if (subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF && ccl_fetch(sd, num_closure) + 2 < MAX_CLOSURE) {
+ /* radius * scale */
+ float3 radius = make_float3(1.0f, 1.0f, 1.0f);
+ /* sharpness */
+ float sharpness = 0.0f;
+ /* texture color blur */
+ float texture_blur = 0.0f;
+
+ /* create one closure per color channel */
+ if (fabsf(subsurf_weight.x) > 0.0f) {
+ sc->weight = make_float3(subsurf_weight.x, 0.0f, 0.0f);
+ sc->sample_weight = subsurf_sample_weight;
+ sc->data0 = radius.x;
+ sc->data1 = texture_blur;
+ sc->data2 = albedo.x;
+ sc->T.x = sharpness;
+# ifdef __OSL__
+ sc->prim = NULL;
+# endif
+ sc->N = N;
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+
+ ccl_fetch(sd, num_closure)++;
+ }
+
+ if (fabsf(subsurf_weight.y) > 0.0f) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
+
+ sc->weight = make_float3(0.0f, subsurf_weight.y, 0.0f);
+ sc->sample_weight = subsurf_sample_weight;
+ sc->data0 = radius.y;
+ sc->data1 = texture_blur;
+ sc->data2 = albedo.y;
+ sc->T.x = sharpness;
+# ifdef __OSL__
+ sc->prim = NULL;
+# endif
+ sc->N = N;
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+
+ ccl_fetch(sd, num_closure)++;
+ }
+
+ if (fabsf(subsurf_weight.z) > 0.0f) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
+
+ sc->weight = make_float3(0.0f, 0.0f, subsurf_weight.z);
+ sc->sample_weight = subsurf_sample_weight;
+ sc->data0 = radius.z;
+ sc->data1 = texture_blur;
+ sc->data2 = albedo.z;
+ sc->T.x = sharpness;
+# ifdef __OSL__
+ sc->prim = NULL;
+# endif
+ sc->N = N;
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+
+ ccl_fetch(sd, num_closure)++;
+ }
+ }
+
/* diffuse */
if (metallic < 1.0f) {
- sc = svm_node_closure_get_bsdf(sd, mix_weight * (1.0f - clamp(metallic, 0.0f, 1.0f)));
-
- if (sc) {
- sc->N = N;
+ if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
+ sc->weight = weight;
+ sc->sample_weight = sample_weight;
- sc->color0 = baseColor;
- sc->data0 = subsurface;
- sc->data1 = roughness;
+ sc = svm_node_closure_get_bsdf(sd, mix_weight * (1.0f - clamp(subsurface, 0.0f, 1.0f)) * (1.0f - clamp(metallic, 0.0f, 1.0f)));
- ccl_fetch(sd, flag) |= bsdf_disney_diffuse_setup(sc);
+ if (sc) {
+ sc->N = N;
+
+ sc->color0 = baseColor;
+ sc->data0 = roughness;
+
+ ccl_fetch(sd, flag) |= bsdf_disney_diffuse_setup(sc);
+ }
}
}
/* sheen */
if (metallic < 1.0f && sheen != 0.0f) {
- if (num_closure + 1 < MAX_CLOSURE) {
- sc = ccl_fetch_array(sd, closure, num_closure + 1);
- sc->weight = weight;
- sc->sample_weight = sample_weight;
+ if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
+ sc->weight = weight;
+ sc->sample_weight = sample_weight;
sc = svm_node_closure_get_bsdf(sd, mix_weight * (1.0f - clamp(metallic, 0.0f, 1.0f)));
@@ -201,8 +271,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
/* specular */
if (specular > 0.0f || metallic > 0.0f) {
- if (num_closure + 1 < MAX_CLOSURE) {
- sc = ccl_fetch_array(sd, closure, num_closure + 1);
+ if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
sc->weight = weight;
sc->sample_weight = sample_weight;
@@ -226,9 +296,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
/* clearcoat */
if (clearcoat > 0.0f) {
- printf("%d\n\r", num_closure + 1);
- if (num_closure + 1 < MAX_CLOSURE) {
- sc = ccl_fetch_array(sd, closure, num_closure + 1);
+ if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
+ sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure));
sc->weight = weight;
sc->sample_weight = sample_weight;
More information about the Bf-blender-cvs
mailing list