[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