[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55922] trunk/blender/intern/cycles/kernel /closure: Fix #34740: cycles rendering issue mixing glossy/glass BSDF' s with zero or very

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Apr 9 17:24:20 CEST 2013


Revision: 55922
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55922
Author:   blendix
Date:     2013-04-09 15:24:20 +0000 (Tue, 09 Apr 2013)
Log Message:
-----------
Fix #34740: cycles rendering issue mixing glossy/glass BSDF's with zero or very
low roughness and same index of refraction.

Problem was bad float precision due to low roughness, which caused the pdf for
the different closures to not match properly.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/closure/bsdf_microfacet.h
    trunk/blender/intern/cycles/kernel/closure/bsdf_refraction.h

Modified: trunk/blender/intern/cycles/kernel/closure/bsdf_microfacet.h
===================================================================
--- trunk/blender/intern/cycles/kernel/closure/bsdf_microfacet.h	2013-04-09 15:18:31 UTC (rev 55921)
+++ trunk/blender/intern/cycles/kernel/closure/bsdf_microfacet.h	2013-04-09 15:24:20 UTC (rev 55922)
@@ -46,7 +46,7 @@
 {
 	float ag = sc->data0;
 
-	float m_ag = clamp(ag, 1e-4f, 1.0f);
+	float m_ag = clamp(ag, 1e-3f, 1.0f);
 
 	sc->data0 = m_ag;
 	sc->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
@@ -59,7 +59,7 @@
 	float ag = sc->data0;
 	float eta = sc->data1;
 
-	float m_ag = clamp(ag, 1e-4f, 1.0f);
+	float m_ag = clamp(ag, 1e-3f, 1.0f);
 	float m_eta = eta;
 
 	sc->data0 = m_ag;
@@ -256,7 +256,7 @@
 __device int bsdf_microfacet_beckmann_setup(ShaderClosure *sc)
 {
 	float ab = sc->data0;
-	float m_ab = clamp(ab, 1e-4f, 1.0f);
+	float m_ab = clamp(ab, 1e-3f, 1.0f);
 
 	sc->data0 = m_ab;
 
@@ -268,7 +268,7 @@
 {
 	float ab = sc->data0;
 	float eta = sc->data1;
-	float m_ab = clamp(ab, 1e-4f, 1.0f);
+	float m_ab = clamp(ab, 1e-3f, 1.0f);
 	float m_eta = eta;
 
 	sc->data0 = m_ab;
@@ -343,7 +343,7 @@
 	float cosHI = dot(Ht, omega_in);
 	// eq. 33: first we calculate D(m) with m=Ht:
 	float alpha2 = m_ab * m_ab;
-	float cosThetaM = dot(N, Ht);
+	float cosThetaM = min(dot(N, Ht), 1.0f);
 	float cosThetaM2 = cosThetaM * cosThetaM;
 	float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
 	float cosThetaM4 = cosThetaM2 * cosThetaM2;
@@ -405,8 +405,8 @@
 					// Eval BRDF*cosNI
 					float cosNI = dot(N, *omega_in);
 					// eq. 26, 27: now calculate G1(i,m) and G1(o,m)
-					float ao = 1 / (m_ab * safe_sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
-					float ai = 1 / (m_ab * safe_sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+					float ao = 1 / (safe_sqrtf(alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+					float ai = 1 / (safe_sqrtf(alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
 					float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
 					float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
 					float G = G1o * G1i;
@@ -452,8 +452,8 @@
 				// eval BRDF*cosNI
 				float cosNI = dot(N, *omega_in);
 				// eq. 26, 27: now calculate G1(i,m) and G1(o,m)
-				float ao = 1 / (m_ab * safe_sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
-				float ai = 1 / (m_ab * safe_sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+				float ao = 1 / (safe_sqrtf(alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+				float ai = 1 / (safe_sqrtf(alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
 				float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
 				float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
 				float G = G1o * G1i;

Modified: trunk/blender/intern/cycles/kernel/closure/bsdf_refraction.h
===================================================================
--- trunk/blender/intern/cycles/kernel/closure/bsdf_refraction.h	2013-04-09 15:18:31 UTC (rev 55921)
+++ trunk/blender/intern/cycles/kernel/closure/bsdf_refraction.h	2013-04-09 15:24:20 UTC (rev 55922)
@@ -74,7 +74,7 @@
 		&inside);
 	
 	if(!inside) {
-		*pdf = 1;
+		*pdf = 1.0f;
 		*eval = make_float3(1.0f, 1.0f, 1.0f);
 		*omega_in = T;
 #ifdef __RAY_DIFFERENTIALS__




More information about the Bf-blender-cvs mailing list