[Bf-blender-cvs] [4f955d0] cycles_disney_brdf: SVM and OSL are both working for the simple version of the Disney BRDF

Pascal Schoen noreply at git.blender.org
Mon May 30 09:09:05 CEST 2016


Commit: 4f955d052358206209454decf2c3539e6a21b42f
Author: Pascal Schoen
Date:   Tue May 24 16:38:23 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB4f955d052358206209454decf2c3539e6a21b42f

SVM and OSL are both working for the simple version of the Disney BRDF

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

M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
M	intern/cycles/kernel/closure/bsdf_disney_diffuse.h
M	intern/cycles/kernel/closure/bsdf_disney_specular.h
M	intern/cycles/kernel/closure/bsdf_util.h
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/svm/svm_closure.h
M	intern/cycles/util/util_math.h

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

diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 58798e0..3da9d22 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#include "../closure/bsdf_util.h"
 #include "../closure/bsdf_ashikhmin_velvet.h"
 #include "../closure/bsdf_diffuse.h"
 #include "../closure/bsdf_oren_nayar.h"
diff --git a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
index 2b21cc6..af141aa 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
@@ -39,7 +39,7 @@ CCL_NAMESPACE_BEGIN
 ccl_device int bsdf_disney_clearcoat_setup(ShaderClosure *sc)
 {
 	/* clearcoat roughness */
-	sc->custom1 = 0.1f * (1.0f - sc->data1) + 0.001f * sc->data1; // mix(0.1f, 0.001f, sc->data1)
+	sc->custom1 = lerp(0.1f, 0.001f, sc->data1/*clearcoatGloss*/); // 0.1f * (1.0f - sc->data1) + 0.001f * sc->data1;
 
     sc->type = CLOSURE_BSDF_DISNEY_CLEARCOAT_ID;
     return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -83,10 +83,13 @@ ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc, co
 			/* eq. 20 */
 			float common = D * 0.25f / cosNO;
 
+			/*float u = clamp(1.0f - dot(omega_in, m), 0.0f, 1.0f);
+			float u2 = u * u;
+			float FH = u2 * u2 * u;*/
 			float FH = schlick_fresnel(dot(omega_in, m));
-			float3 F = make_float3(0.04f, 0.04f, 0.04f) * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH; // mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+			float3 F = lerp(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH); // make_float3(0.04f, 0.04f, 0.04f) * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
-			float3 out = F * G * common * 0.25f * sc->data0;
+			float3 out = F * G * common * 0.25f * sc->data0/*clearcoat*/;
 
 			/* eq. 2 in distribution of visible normals sampling
 			 * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
@@ -172,10 +175,13 @@ ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc,
 						float common = (G1o * D) * 0.25f / cosNO;
 						*pdf = common;
 
+						/*float u = clamp(1.0f - dot(*omega_in, m), 0.0f, 1.0f);
+						float u2 = u * u;
+						float FH = u2 * u2 * u;*/
 						float FH = schlick_fresnel(dot(*omega_in, m));
-						float3 F = make_float3(0.04f, 0.04f, 0.04f) * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH; // mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH)
+						float3 F = lerp(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH); // make_float3(0.04f, 0.04f, 0.04f) * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
-						*eval = G1i * common * F * 0.25f * sc->data0;
+						*eval = G1i * common * F * 0.25f * sc->data0/*clearcoat*/;
 					}
 
 #ifdef __RAY_DIFFERENTIALS__
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 6b3cbac..2706770 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -34,8 +34,6 @@
 #ifndef __BSDF_DISNEY_DIFFUSE_H__
 #define __BSDF_DISNEY_DIFFUSE_H__
 
-#include "closure/bsdf_util.h"
-
 CCL_NAMESPACE_BEGIN
 
 
@@ -55,27 +53,27 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
     float Fd = 0.0f;
 	float FL = schlick_fresnel(NdotL), FV = schlick_fresnel(NdotV);
 
-	if (sc->data0 != 1.0f) {
-	    const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * sc->data1;
-	    Fd = (1.0f * (1.0f - FL) + Fd90 * FL) * (1.0f * (1.0f - FV) + Fd90 * FV); // mix(1.0f, Fd90, FL) * mix(1.0f, Fd90, FV)
+	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 > 0.0f) {
-	    float Fss90 = LdotH*LdotH * sc->data1;
-	    float Fss = (1.0f * (1.0f - FL) + Fss90 * FL) * (1.0f * (1.0f - FV) + Fss90 * FV); // mix(1.0f, Fss90, FL) * mix(1.0f, Fss90, 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 = (Fd * (1.0f - sc->data0) + ss * sc->data0); // mix(Fd, ss, sc->data0)
+		Fd = lerp(Fd, ss, sc->data0/*subsurface*/); // (Fd * (1.0f - sc->data0) + ss * sc->data0);
     }
 
-	float3 value = M_1_PI_F * Fd * sc->color0;
+	float3 value = M_1_PI_F * Fd * sc->color0/*baseColor*/;
 
 	*pdf = M_1_PI_F * 0.5f;
 
 	// sheen component
-	if (sc->data2 != 0.0f) {
+	if (sc->data2/*sheen*/ != 0.0f) {
 		float FH = schlick_fresnel(LdotH);
 
-		value += FH * sc->data2 * sc->custom_color0;
+		value += FH * sc->data2/*sheen*/ * sc->custom_color0/*baseColor*/;
 	}
 
 	value *= NdotL;
@@ -90,7 +88,7 @@ ccl_device int bsdf_disney_diffuse_setup(ShaderClosure *sc)
 	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 = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data3) + m_ctint * sc->data3; // mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3)
+	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_specular.h b/intern/cycles/kernel/closure/bsdf_disney_specular.h
index 30ebba6..cc9a420 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_specular.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_specular.h
@@ -33,8 +33,6 @@
 #ifndef __BSDF_DISNEY_SPECULAR_H__
 #define __BSDF_DISNEY_SPECULAR_H__
 
-#include "closure/bsdf_util.h"
-
 CCL_NAMESPACE_BEGIN
 
 
@@ -42,13 +40,13 @@ ccl_device int bsdf_disney_specular_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
+	float3 m_ctint = m_cdlum > 0.0f ? sc->color0/*baseColor*/ / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
 
-	float3 tmp_col = make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data2) + m_ctint * sc->data2; // mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data2);
-	sc->custom_color0 = (sc->data1 * 0.08f * tmp_col) * (1.0f - sc->data0) + sc->color0 * sc->data0; // mix(sc->data1 * 0.08f * tmp_col, sc->color0, sc->data0);
+	float3 tmp_col = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data2/*specularTint*/); // make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data2) + m_ctint * sc->data2;
+	sc->custom_color0/*cspec0*/ = lerp(sc->data1/*specular*/ * 0.08f * tmp_col, sc->color0/*baseColor*/, sc->data0/*metallic*/); // (sc->data1 * 0.08f * tmp_col) * (1.0f - sc->data0) + sc->color0 * sc->data0;
 
-	float aspect = sqrt(1.0f - sc->data4 * 0.9f);
-	float r2 = sqr(sc->data3);
+	float aspect = safe_sqrtf(1.0f - sc->data4/*anisotropic*/ * 0.9f);
+	float r2 = sqr(sc->data3/*roughness*/);
 	
 	/* ax */
 	sc->custom1 = fmaxf(0.001f, r2 / aspect);
@@ -57,7 +55,7 @@ ccl_device int bsdf_disney_specular_setup(ShaderClosure *sc)
 	sc->custom2 = fmaxf(0.001f, r2 * aspect);
 
 	/* rough_g */
-	sc->custom3 = sqr(sc->data3 * 0.5f + 0.5f);
+	sc->custom3 = sqr(sc->data3/*roughness*/ * 0.5f + 0.5f);
 
     sc->type = CLOSURE_BSDF_DISNEY_SPECULAR_ID;
     return SD_BSDF|SD_BSDF_HAS_EVAL;
@@ -138,8 +136,12 @@ ccl_device float3 bsdf_disney_specular_eval_reflect(const ShaderClosure *sc, con
 		/* eq. 20 */
 		float common = D * 0.25f / cosNO;
 
+		/*float u = clamp(1.0f - dot(omega_in, m), 0.0f, 1.0f);
+		float u2 = u * u;
+		float FH = u2 * u2 * u;*/
         float FH = schlick_fresnel(dot(omega_in, m));
-		float3 F = sc->custom_color0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH; // mix(sc->custom_color0, make_float3(1.0f, 1.0f, 1.0f), FH);
+		float3 F = lerp(sc->custom_color0, make_float3(1.0f, 1.0f, 1.0f), FH); // sc->custom_color0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
+		//printf("%f, %f\n\r", dot(omega_in, m), FH);
 
 		float3 out = F * G * common;
 
@@ -254,8 +256,11 @@ ccl_device int bsdf_disney_specular_sample(const ShaderClosure *sc,
                     float common = (G1o * D) * 0.25f / cosNO;
                     *pdf = common;
 
+					/*float u = clamp(1.0f - dot(*omega_in, m), 0.0f, 1.0f);
+					float u2 = u * u;
+					float FH = u2 * u2 * u;*/
 					float FH = schlick_fresnel(dot(*omega_in, m));
-					float3 F = sc->custom_color0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH; // mix(sc->custom_color0, make_float3(1.0f, 1.0f, 1.0f), FH);
+					float3 F = lerp(sc->custom_color0, make_float3(1.0f, 1.0f, 1.0f), FH); // sc->custom_color0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
                     *eval = G1i * common * F;
                 }
diff --git a/intern/cycles/kernel/closure/bsdf_util.h b/intern/cycles/kernel/closure/bsdf_util.h
index 7888aaa..9c6b555 100644
--- a/intern/cycles/kernel/closure/bsdf_util.h
+++ b/intern/cycles/kernel/closure/bsdf_util.h
@@ -126,14 +126,15 @@ ccl_device float3 fresnel_conductor(float cosi, const float3 eta, const float3 k
 }
 #endif
 
-ccl_device_inline float schlick_fresnel(float u)
+ccl_device float schlick_fresnel(float u)
 {
 	float m = clamp(1.0f - u, 0.0f, 1.0f);
 	float m2 = m * m;
+	//printf("%f, %f, %f, %f\n\r", u, m, m2, m2 * m2 * m);
 	return m2 * m2 * m; // pow(m, 5)
 }
 
-ccl_device_inline float sqr(float a)
+ccl_device float sqr(float a)
 {
 	return a * a;
 }
@@ -150,7 +151,7 @@ ccl_device float smooth_step(float edge0, float edge1, float x)
 	return result;
 }
 
-ccl_device_inline void importance_sample_ggx_slopes(
+ccl_device void importance_sample_ggx_slopes(
 	const float cos_theta_i, const float sin_theta_i,
 	float randu, float randv, float

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list