[Bf-blender-cvs] [11160fa] cycles_disney_brdf: Added Disney Sheen shader as a preparation to get to a BSSRDF

Pascal Schoen noreply at git.blender.org
Mon May 30 12:43:27 CEST 2016


Commit: 11160fa4e1c32230119d4506e7e9fd3da2ab37f2
Author: Pascal Schoen
Date:   Mon May 30 10:16:30 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB11160fa4e1c32230119d4506e7e9fd3da2ab37f2

Added Disney Sheen shader as a preparation to get to a BSSRDF

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

M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_disney_diffuse.h
A	intern/cycles/kernel/closure/bsdf_disney_sheen.h
M	intern/cycles/kernel/osl/CMakeLists.txt
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	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/kernel/svm/svm_types.h

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

diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index bc75adb..b8f8aa0 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -89,6 +89,7 @@ set(SRC_CLOSURE_HEADERS
 	closure/emissive.h
 	closure/volume.h
     closure/bsdf_disney_diffuse.h
+    closure/bsdf_disney_sheen.h
     closure/bsdf_disney_specular.h
     closure/bsdf_disney_clearcoat.h
 )
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 3da9d22..8ede88f 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -27,6 +27,7 @@
 #include "../closure/bsdf_toon.h"
 #include "../closure/bsdf_hair.h"
 #include "../closure/bsdf_disney_diffuse.h"
+#include "../closure/bsdf_disney_sheen.h"
 #include "../closure/bsdf_disney_specular.h"
 #include "../closure/bsdf_disney_clearcoat.h"
 #ifdef __SUBSURFACE__
@@ -123,6 +124,10 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const Shader
 			label = bsdf_disney_diffuse_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
 				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
 			break;
+		case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+			label = bsdf_disney_sheen_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
+				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+			break;
 		case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
 			label = bsdf_disney_specular_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
 				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
@@ -214,6 +219,9 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
 			case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
 				eval = bsdf_disney_diffuse_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
+			case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+				eval = bsdf_disney_sheen_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
 			case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
 				eval = bsdf_disney_specular_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
@@ -285,6 +293,9 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
 			case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
 				eval = bsdf_disney_diffuse_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
+			case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+				eval = bsdf_disney_sheen_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
 			case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
 				eval = bsdf_disney_specular_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 2706770..7e0b74d 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -69,13 +69,6 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
 
 	*pdf = M_1_PI_F * 0.5f;
 
-	// sheen component
-	if (sc->data2/*sheen*/ != 0.0f) {
-		float FH = schlick_fresnel(LdotH);
-
-		value += FH * sc->data2/*sheen*/ * sc->custom_color0/*baseColor*/;
-	}
-
 	value *= NdotL;
 
 	return value;
@@ -83,13 +76,6 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
 
 ccl_device int bsdf_disney_diffuse_setup(ShaderClosure *sc)
 {
-	float m_cdlum = 0.3f * sc->color0[0] + 0.6f * sc->color0[1] + 0.1f * sc->color0[2]; // luminance approx.
-
-	float3 m_ctint = m_cdlum > 0.0f ? sc->color0 / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
-
-	/* csheen0 */
-	sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3/*sheenTint*/); //  make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data3) + m_ctint * sc->data3;
-
 	sc->type = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
similarity index 65%
copy from intern/cycles/kernel/closure/bsdf_disney_diffuse.h
copy to intern/cycles/kernel/closure/bsdf_disney_sheen.h
index 2706770..c386254 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
@@ -31,70 +31,50 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __BSDF_DISNEY_DIFFUSE_H__
-#define __BSDF_DISNEY_DIFFUSE_H__
+#ifndef __BSDF_DISNEY_SHEEN_H__
+#define __BSDF_DISNEY_SHEEN_H__
 
 CCL_NAMESPACE_BEGIN
 
 
-ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
+ccl_device float3 calculate_disney_sheen_brdf(const ShaderClosure *sc,
 	float3 N, float3 V, float3 L, float3 H, float *pdf)
 {
 	float NdotL = dot(N, L);
 	float NdotV = dot(N, V);
 
-    if (NdotL < 0 || NdotV < 0) {
+    if (NdotL < 0 || NdotV < 0 || sc->data0 == 0.0f) {
         *pdf = 0.0f;
         return make_float3(0.0f, 0.0f, 0.0f);
     }
 
 	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);
-    }
-
-	float3 value = M_1_PI_F * Fd * sc->color0/*baseColor*/;
-
 	*pdf = M_1_PI_F * 0.5f;
 
-	// sheen component
-	if (sc->data2/*sheen*/ != 0.0f) {
-		float FH = schlick_fresnel(LdotH);
+	float FH = schlick_fresnel(LdotH);
 
-		value += FH * sc->data2/*sheen*/ * sc->custom_color0/*baseColor*/;
-	}
+	float3 value = FH * sc->data0/*sheen*/ * sc->custom_color0/*csheen0*/;
 
 	value *= NdotL;
 
 	return value;
 }
 
-ccl_device int bsdf_disney_diffuse_setup(ShaderClosure *sc)
+ccl_device int bsdf_disney_sheen_setup(ShaderClosure *sc)
 {
 	float m_cdlum = 0.3f * sc->color0[0] + 0.6f * sc->color0[1] + 0.1f * sc->color0[2]; // luminance approx.
 
 	float3 m_ctint = m_cdlum > 0.0f ? sc->color0 / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
 
 	/* csheen0 */
-	sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3/*sheenTint*/); //  make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data3) + m_ctint * sc->data3;
+	sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data1/*sheenTint*/);
 
-	sc->type = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
+	sc->type = CLOSURE_BSDF_DISNEY_SHEEN_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
-ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I,
+ccl_device float3 bsdf_disney_sheen_eval_reflect(const ShaderClosure *sc, const float3 I,
 	const float3 omega_in, float *pdf)
 {
 	float3 N = normalize(sc->N);
@@ -103,7 +83,7 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, cons
 	float3 H = normalize(L + V);
 
     if (dot(sc->N, omega_in) > 0.0f) {
-        float3 value = calculate_disney_diffuse_brdf(sc, N, V, L, H, pdf);
+        float3 value = calculate_disney_sheen_brdf(sc, N, V, L, H, pdf);
 
 		return value;
     }
@@ -113,13 +93,13 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, cons
     }
 }
 
-ccl_device float3 bsdf_disney_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I,
+ccl_device float3 bsdf_disney_sheen_eval_transmit(const ShaderClosure *sc, const float3 I,
 	const float3 omega_in, float *pdf)
 {
 	return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
+ccl_device int bsdf_disney_sheen_sample(const ShaderClosure *sc,
 	float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv,
 	float3 *eval, float3 *omega_in, float3 *domega_in_dx,
 	float3 *domega_in_dy, float *pdf)
@@ -131,7 +111,7 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
 	if (dot(Ng, *omega_in) > 0) {
 		float3 H = normalize(I + *omega_in);
 
-		*eval = calculate_disney_diffuse_brdf(sc, N, I, *omega_in, H, pdf);
+		*eval = calculate_disney_sheen_brdf(sc, N, I, *omega_in, H, pdf);
 
 #ifdef __RAY_DIFFERENTIALS__
 		// TODO: find a better approximation for the diffuse bounce
@@ -147,6 +127,6 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
 
 CCL_NAMESPACE_END
 
-#endif /* __BSDF_DISNEY_DIFFUSE_H__ */
+#endif /* __BSDF_DISNEY_SHEEN_H__ */
 
 
diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt
index 6bde211..9cf4f2d 100644
--- a/intern/cycles/kernel/osl/CMakeLists.txt
+++ b/intern/cycles/kernel/osl/CMakeLists.txt
@@ -22,9 +22,6 @@ set(SRC
 	osl_closures.cpp
 	osl_services.cpp
 	osl_shader.cpp
-	#bsdf_disney_diffuse.cpp
-	#bsdf_disney_specular.cpp
-	#bsdf_disney_clearcoat.cpp
 )
 
 set(HEADER_SRC
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp
index 96694ed..45fe156 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -57,6 +57,7 @@
 #include "closure/bsdf_toon.h"
 #include "closure/bsdf_hair.h"
 #include "closure/bsdf_disney_diffuse.h"
+#include "closure/bsdf_disney_sheen.h"
 #include "closure/bsdf_disney_specular.h"
 #include "closure/bsdf_disney_clearcoat.h"
 #include "closure/volume.h"
@@ -168,32 +169,6 @@ BSDF_CLOSURE_CLASS_BEGIN(HairTransmission, hair_transmission, hair_transmission,
 	CLOSURE_FLOAT_PARAM(HairReflectionClosure, sc.data2),
 BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
 
-/*BSDF_CLOSURE_CLASS_BEGIN(DisneyDiffuse, disney_diffuse, disney_diffuse, LABEL_DIFFUSE|LABEL_REFLECT)
-	CLOSURE_FLOAT3_PARAM(DisneyDiffuseClosure, sc.N),
-	CLOSURE_FLOAT3_PARAM(DisneyDiffuse

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list