[Bf-blender-cvs] [521d433] cycles_disney_bsdf_transmittance: Enhanced the thin surface specular transmission approximation by a simple reflection to the other side without refracting it (refraction approximately cancels for thin surfaces).

Pascal Schoen noreply at git.blender.org
Wed Dec 14 15:06:55 CET 2016


Commit: 521d4335ef8cb1b63008a64fe633c7202d6d9fbe
Author: Pascal Schoen
Date:   Fri Dec 2 13:43:06 2016 +0100
Branches: cycles_disney_bsdf_transmittance
https://developer.blender.org/rB521d4335ef8cb1b63008a64fe633c7202d6d9fbe

Enhanced the thin surface specular transmission approximation by a simple reflection to the other side without refracting it (refraction approximately cancels for thin surfaces).

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

M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/kernel/svm/svm_types.h
M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib

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

diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 83e33c1..4f8180a 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -90,6 +90,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
 		case CLOSURE_BSDF_MICROFACET_GGX_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
 			label = bsdf_microfacet_ggx_sample(kg, 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;
@@ -206,6 +207,7 @@ float3 bsdf_eval(KernelGlobals *kg,
 			case CLOSURE_BSDF_MICROFACET_GGX_ID:
 			case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
 			case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+			case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
 				eval = bsdf_microfacet_ggx_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
 			case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
@@ -285,6 +287,7 @@ float3 bsdf_eval(KernelGlobals *kg,
 			case CLOSURE_BSDF_MICROFACET_GGX_ID:
 			case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
 			case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+			case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
 				eval = bsdf_microfacet_ggx_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
 				break;
 			case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
@@ -355,6 +358,7 @@ ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness)
 		case CLOSURE_BSDF_MICROFACET_GGX_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
 			bsdf_microfacet_ggx_blur(sc, roughness);
 			break;
 		case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
@@ -389,6 +393,7 @@ ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
 		case CLOSURE_BSDF_MICROFACET_GGX_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
 		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+		case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID:
 		case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
 		case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
 		case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index ea4e4d3..88dbe3f 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -377,6 +377,18 @@ ccl_device int bsdf_microfacet_ggx_refraction_setup(MicrofacetBsdf *bsdf)
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
+ccl_device int bsdf_microfacet_ggx_refraction_thin_setup(MicrofacetBsdf *bsdf)
+{
+	bsdf->extra = NULL;
+
+	bsdf->alpha_x = saturate(bsdf->alpha_x);
+	bsdf->alpha_y = bsdf->alpha_x;
+
+	bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
+
+	return SD_BSDF|SD_BSDF_HAS_EVAL;
+}
+
 ccl_device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
 {
 	MicrofacetBsdf *bsdf = (MicrofacetBsdf*)sc;
@@ -390,7 +402,7 @@ ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc, cons
 	const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
 	float alpha_x = bsdf->alpha_x;
 	float alpha_y = bsdf->alpha_y;
-	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
 	float3 N = bsdf->N;
 
 	if(m_refractive || alpha_x*alpha_y <= 1e-7f)
@@ -499,7 +511,7 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc, con
 	float alpha_x = bsdf->alpha_x;
 	float alpha_y = bsdf->alpha_y;
 	float m_eta = bsdf->ior;
-	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
 	float3 N = bsdf->N;
 
 	if(!m_refractive || alpha_x*alpha_y <= 1e-7f)
@@ -512,7 +524,15 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc, con
 		return make_float3(0.0f, 0.0f, 0.0f); /* vectors on same side -- not possible */
 
 	/* compute half-vector of the refraction (eq. 16) */
-	float3 ht = -(m_eta * omega_in + I);
+	float3 ht;
+	if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+		/* for thin surfaces refraction approximately cancels and thus specular transmission is modelled
+		 * using a microfacet distribution which is simply reflected to the other side */
+		ht = -(omega_in + I);
+	}
+	else {
+		ht = -(m_eta * omega_in + I);
+	}
 	float3 Ht = normalize(ht);
 	float cosHO = dot(Ht, I);
 	float cosHI = dot(Ht, omega_in);
@@ -541,7 +561,13 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc, con
 
 	/* out = fabsf(cosHI * cosHO) * (m_eta * m_eta) * G * D / (cosNO * Ht2)
 	 * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */
-	float common = D * (m_eta * m_eta) / (cosNO * Ht2);
+	float common;
+	if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+		common = D * 0.25f / cosNO;
+	}
+	else {
+		common = D * (m_eta * m_eta) / (cosNO * Ht2);
+	}
 	float out = G * fabsf(cosHI * cosHO) * common;
 	*pdf = G1o * fabsf(cosHO * cosHI) * common;
 
@@ -553,7 +579,7 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
 	const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
 	float alpha_x = bsdf->alpha_x;
 	float alpha_y = bsdf->alpha_y;
-	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+	bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID || bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID;
 	float3 N = bsdf->N;
 
 	float cosNO = dot(N, I);
@@ -685,6 +711,10 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
 			float m_eta = bsdf->ior, fresnel;
 			bool inside;
 
+			if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+				m_eta = 1.0f;
+			}
+
 			fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
 				dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
@@ -1054,7 +1084,7 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
 				*domega_in_dy = dTdy;
 #endif
 
-				if(alpha_x*alpha_y <= 1e-7f || fabsf(m_eta - 1.0f) < 1e-4f) {
+				if(alpha_x*alpha_y <= 1e-7f || (fabsf(m_eta - 1.0f) < 1e-4f && bsdf->type != CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID)) {
 					/* some high number for MIS */
 					*pdf = 1e6f;
 					*eval = make_float3(1e6f, 1e6f, 1e6f);
@@ -1081,7 +1111,13 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
 					Ht2 *= Ht2;
 
 					/* see eval function for derivation */
-					float common = D * (m_eta * m_eta) / (cosNO * Ht2);
+					float common;
+					if(bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID) {
+						common = D * 0.25f / cosNO;
+					}
+					else {
+						common = D * (m_eta * m_eta) / (cosNO * Ht2);
+					}
 					float out = G * fabsf(cosHI * cosHO) * common;
 					*pdf = G1o * cosHO * fabsf(cosHI) * common;
 
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 4958bfd..96d9984 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -437,6 +437,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 								 * Burley, Brent (Walt Disney Animation Studios) */
 								if(surface_type == THIN_SURFACE) {
 									refraction_roughness *= 0.65f * ior - 0.35f;
+									//refraction_roughness = safe_sqrtf(refraction_roughness);
 								}
 								else {
 									refraction_roughness *= refraction_roughness;
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 92aed74..821716d 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -425,6 +425,7 @@ typedef enum ClosureType {
 	CLOSURE_BSDF_REFRACTION_ID,
 	CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID,
 	CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID,
+	CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_THIN_ID,
 	CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID,
 	CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID,
 	CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID,
diff --git a/release/datafiles/locale b/release/datafiles/locale
index dc16605..2b3c19f 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit dc166057192ea882b5cc70484d4c8bacd7cb41b4
+Subproject commit 2b3c19f5f61fc72dba56a7edfdc4e55e2327dc1f
diff --git a/release/scripts/addons b/release/scripts/addons
index 06dad53..3d8df61 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 06dad53c80801e0e0919f086040e3d9c31bbd0a1
+Subproject commit 3d8df6195de4062b60783c6c7791904a5f0087a3
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 04af69b..a52733b 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 04af69be141a5757fc60b44cc1a5b72db524af30
+Subproject commit a52733b58d95ce60ecde95a9eca242e7319c285a




More information about the Bf-blender-cvs mailing list