[Bf-blender-cvs] [1f5c418] cycles_disney_brdf: Disney node can be used without SVM and started to cleanup the OSL implementation

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


Commit: 1f5c41874b01ad297eb8a6bad9985296c6c0a6e1
Author: Pascal Schoen
Date:   Tue May 24 09:58:50 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB1f5c41874b01ad297eb8a6bad9985296c6c0a6e1

Disney node can be used without SVM and started to cleanup the OSL implementation

There is still some wrong behavior for SVM for the Schlick Fresnel part at the
specular and clearcoat

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

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/osl/CMakeLists.txt
M	intern/cycles/kernel/osl/bsdf_disney_clearcoat.cpp
M	intern/cycles/kernel/osl/bsdf_disney_diffuse.cpp
M	intern/cycles/kernel/osl/bsdf_disney_specular.cpp
M	intern/cycles/kernel/osl/osl_closures.cpp
M	intern/cycles/kernel/osl/osl_closures.h
M	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.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 7d4b8bd..58798e0 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -14,6 +14,7 @@
  * 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"
@@ -119,6 +120,18 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const Shader
 			label = bsdf_hair_transmission_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_DIFFUSE_ID:
+			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_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);
+			break;
+		case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+			label = bsdf_disney_clearcoat_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;
 #endif
 #ifdef __VOLUME__
 		case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
@@ -199,6 +212,15 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
 			case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
 				eval = bsdf_hair_transmission_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
+			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_SPECULAR_ID:
+				eval = bsdf_disney_specular_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
+			case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+				eval = bsdf_disney_clearcoat_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
 #endif
 #ifdef __VOLUME__
 			case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
@@ -261,6 +283,15 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
 			case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
 				eval = bsdf_hair_transmission_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
+			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_SPECULAR_ID:
+				eval = bsdf_disney_specular_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
+			case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+				eval = bsdf_disney_clearcoat_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+				break;
 #endif
 #ifdef __VOLUME__
 			case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
index a96fc46..2b21cc6 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
@@ -35,33 +35,17 @@
 
 CCL_NAMESPACE_BEGIN
 
-/*struct DisneyClearcoatBRDFParams {
-    // brdf parameters
-    float m_clearcoat;
-    float m_clearcoatGloss;
-
-    // precomputed values
-	float m_clearcoatRoughness;
-
-    void precompute_values() {
-		m_clearcoatRoughness = mix(0.1f, 0.001f, m_clearcoatGloss);
-    }
-};
-
-typedef struct DisneyClearcoatBRDFParams DisneyClearcoatBRDFParams;*/
-
 
 ccl_device int bsdf_disney_clearcoat_setup(ShaderClosure *sc)
 {
 	/* clearcoat roughness */
-	sc->custom1 = mix(0.1f, 0.001f, sc->data1);
+	sc->custom1 = 0.1f * (1.0f - sc->data1) + 0.001f * sc->data1; // mix(0.1f, 0.001f, sc->data1)
 
     sc->type = CLOSURE_BSDF_DISNEY_CLEARCOAT_ID;
     return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
-ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc,
-    /*const DisneyClearcoatBRDFParams *params, */const float3 I,
+ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc, const float3 I,
     const float3 omega_in, float *pdf)
 {
 	if (sc->data0 > 0.0f) {
@@ -100,7 +84,7 @@ ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc,
 			float common = D * 0.25f / cosNO;
 
 			float FH = schlick_fresnel(dot(omega_in, m));
-			float3 F = mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+			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 out = F * G * common * 0.25f * sc->data0;
 
@@ -124,7 +108,7 @@ ccl_device float3 bsdf_disney_clearcoat_eval_transmit(const ShaderClosure *sc, c
     return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc, /*const DisneyClearcoatBRDFParams *params,*/
+ccl_device int bsdf_disney_clearcoat_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)
@@ -189,7 +173,7 @@ ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc, /*const Dis
 						*pdf = common;
 
 						float FH = schlick_fresnel(dot(*omega_in, m));
-						float3 F = mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+						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)
 
 						*eval = G1i * common * F * 0.25f * sc->data0;
 					}
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 85a5db4..6b3cbac 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -34,33 +34,13 @@
 #ifndef __BSDF_DISNEY_DIFFUSE_H__
 #define __BSDF_DISNEY_DIFFUSE_H__
 
-CCL_NAMESPACE_BEGIN
-
-/*struct DisneyDiffuseBRDFParams {
-	// brdf parameters
-	float3 m_base_color;
-	float m_subsurface;
-	float m_roughness;
-	float m_sheen;
-	float m_sheen_tint;
-
-	// precomputed values
-	float3 m_csheen;
-
-	void precompute_values() {
-		float m_cdlum = 0.3f * m_base_color[0] + 0.6f * m_base_color[1] + 0.1f * m_base_color[2]; // luminance approx.
+#include "closure/bsdf_util.h"
 
-		float3 m_ctint = m_cdlum > 0.0f ? m_base_color / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
-		m_csheen = mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, m_sheen_tint);
-	}
-};
-
-typedef struct DisneyDiffuseBRDFParams DisneyDiffuseBRDFParams;*/
+CCL_NAMESPACE_BEGIN
 
 
 ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
-	/*const DisneyDiffuseBRDFParams *params, */float3 N, float3 V, float3 L,
-	float3 H, float *pdf)
+	float3 N, float3 V, float3 L, float3 H, float *pdf)
 {
 	float NdotL = dot(N, L);
 	float NdotV = dot(N, V);
@@ -77,14 +57,14 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
 
 	if (sc->data0 != 1.0f) {
 	    const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * sc->data1;
-	    Fd = mix(1.0f, Fd90, FL) * mix(1.0f, Fd90, FV);
+	    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 > 0.0f) {
 	    float Fss90 = LdotH*LdotH * sc->data1;
-	    float Fss = mix(1.0f, Fss90, FL) * mix(1.0f, Fss90, FV);
+	    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)
 	    float ss = 1.25f * (Fss * (1.0f / (NdotL + NdotV) - 0.5f) + 0.5f);
-        Fd = mix(Fd, ss, sc->data0);
+        Fd = (Fd * (1.0f - sc->data0) + ss * sc->data0); // mix(Fd, ss, sc->data0)
     }
 
 	float3 value = M_1_PI_F * Fd * sc->color0;
@@ -110,14 +90,13 @@ 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 = mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3);
+	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->type = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
-ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc,
-	/*const DisneyDiffuseBRDFParams *params, */const float3 I,
+ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I,
 	const float3 omega_in, float *pdf)
 {
 	float3 N = normalize(sc->N);
@@ -126,7 +105,7 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc,
 	float3 H = normalize(L + V);
 
     if (dot(sc->N, omega_in) > 0.0f) {
-        float3 value = calculate_disney_diffuse_brdf(sc, /*params, */N, V, L, H, pdf);
+        float3 value = calculate_disney_diffuse_brdf(sc, N, V, L, H, pdf);
 
 		return value;
     }
@@ -136,12 +115,13 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc,
     }
 }
 
-ccl_device float3 bsdf_disney_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+ccl_device float3 bsdf_disney_diffuse_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, /*const DisneyDiffuseBRDFParams *params,*/
+ccl_device int bsdf_disney_diffuse_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)
@@ -153,7 +133,7 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc, /*const Disne
 	if (dot(Ng, *omega_in) > 0) {
 		float3 H = normali

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list