[Bf-blender-cvs] [baf66bfa482] upstream_cycles_texture_cache: Cycles: improved ray differentials for specular/glossy closures with DNDU/V enabled

Stefan Werner noreply at git.blender.org
Wed Jun 27 14:05:04 CEST 2018


Commit: baf66bfa482e8f0ce15a58dfc55196ee7d533192
Author: Stefan Werner
Date:   Mon Jul 31 14:15:48 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rBbaf66bfa482e8f0ce15a58dfc55196ee7d533192

Cycles: improved ray differentials for specular/glossy closures with DNDU/V enabled

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

M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/closure/bsdf_microfacet_multi.h
M	intern/cycles/kernel/closure/bsdf_refraction.h
M	intern/cycles/kernel/closure/bsdf_util.h
M	intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 2b0b853b8b9..4bfd9a94a77 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -115,7 +115,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
 			break;
 		case CLOSURE_BSDF_REFRACTION_ID:
 			label = bsdf_refraction_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
-				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf, sd);
 			break;
 		case CLOSURE_BSDF_TRANSPARENT_ID:
 			label = bsdf_transparent_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
@@ -138,7 +138,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
 		case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
 		case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
 			label = bsdf_microfacet_multi_ggx_glass_sample(kg, sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
-			        eval, omega_in,  &domega_in->dx, &domega_in->dy, pdf, &sd->lcg_state);
+			        eval, omega_in,  &domega_in->dx, &domega_in->dy, pdf, &sd->lcg_state, sd);
 			break;
 		case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
 		case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index c9729fbc32e..07f8fad4ff2 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -688,8 +688,8 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
 					float3 dwody = -dIdy;
 					float dDNdx = dot(dwodx, N) + dot(I, sd->dNdx);
 					float dDNdy = dot(dwody, N) + dot(I, sd->dNdy);
-					*domega_in_dx = dwodx + 2.f * (dot(I, N) * sd->dNdx + dDNdx * N);
-					*domega_in_dy = dwody + 2.f * (dot(I, N) * sd->dNdy + dDNdy * N);
+					*domega_in_dx = dwodx + 2.0f * (dot(I, N) * sd->dNdx + dDNdx * N);
+					*domega_in_dy = dwody + 2.0f * (dot(I, N) * sd->dNdy + dDNdy * N);
 #else
 					*domega_in_dx = (2.0f * dot(m, dIdx)) * m - dIdx;
 					*domega_in_dy = (2.0f * dot(m, dIdy)) * m - dIdy;
@@ -715,6 +715,9 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
 
 			fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
+#  ifdef __DNDU__
+				sd->dNdx,  sd->dNdy,
+#  endif
 				dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
 #endif
 				&inside);
@@ -1094,6 +1097,9 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
 
 			fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
+#  ifdef __DNDU__
+				sd->dNdx,  sd->dNdy,
+#  endif
 				dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
 #endif
 				&inside);
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
index 47f995568a2..00da9f3349f 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
@@ -478,8 +478,9 @@ ccl_device int bsdf_microfacet_multi_ggx_sample(KernelGlobals *kg, const ShaderC
 #ifdef __RAY_DIFFERENTIALS__
 	*domega_in_dx = (2.0f * dot(Z, dIdx)) * Z - dIdx;
 	*domega_in_dy = (2.0f * dot(Z, dIdy)) * Z - dIdy;
-	*domega_in_dx *= 10.0f;
-	*domega_in_dy *= 10.0f;
+	const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+	*domega_in_dx *= (1.0f + softness);
+	*domega_in_dy *= (1.0f + softness);
 #endif
 	return LABEL_REFLECT|LABEL_GLOSSY;
 }
@@ -559,7 +560,7 @@ ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_reflect(const ShaderClosu
 	return mf_eval_glass(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, use_fresnel, bsdf->extra->cspec0);
 }
 
-ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, 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, ccl_addr_space uint *lcg_state)
+ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, 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, ccl_addr_space uint *lcg_state, const ShaderData *sd)
 {
 	const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
 
@@ -574,6 +575,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
 		bool inside;
 		float fresnel = fresnel_dielectric(bsdf->ior, Z, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
+#  ifdef __DNDU__
+				sd->dNdx,  sd->dNdy,
+#  endif
 		                dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
 #endif
 		                &inside);
@@ -614,6 +618,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
 #ifdef __RAY_DIFFERENTIALS__
 		*domega_in_dx = (2 * dot(Z, dIdx)) * Z - dIdx;
 		*domega_in_dy = (2 * dot(Z, dIdy)) * Z - dIdy;
+		const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+		*domega_in_dx *= (1.0f + softness);
+		*domega_in_dy *= (1.0f + softness);
 #endif
 		return LABEL_REFLECT|LABEL_GLOSSY;
 	}
@@ -623,6 +630,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
 		float dnp = max(sqrtf(1.0f - (bsdf->ior * bsdf->ior * (1.0f - cosI*cosI))), 1e-7f);
 		*domega_in_dx = -(bsdf->ior * dIdx) + ((bsdf->ior - bsdf->ior * bsdf->ior * cosI / dnp) * dot(dIdx, Z)) * Z;
 		*domega_in_dy = -(bsdf->ior * dIdy) + ((bsdf->ior - bsdf->ior * bsdf->ior * cosI / dnp) * dot(dIdy, Z)) * Z;
+		const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+		*domega_in_dx *= (1.0f + softness);
+		*domega_in_dy *= (1.0f + softness);
 #endif
 
 		return LABEL_TRANSMIT|LABEL_GLOSSY;
diff --git a/intern/cycles/kernel/closure/bsdf_refraction.h b/intern/cycles/kernel/closure/bsdf_refraction.h
index 050a4e76fa9..29dc96da454 100644
--- a/intern/cycles/kernel/closure/bsdf_refraction.h
+++ b/intern/cycles/kernel/closure/bsdf_refraction.h
@@ -53,7 +53,7 @@ ccl_device float3 bsdf_refraction_eval_transmit(const ShaderClosure *sc, const f
 	return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-ccl_device int bsdf_refraction_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)
+ccl_device int bsdf_refraction_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, ShaderData *sd)
 {
 	const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
 	float m_eta = bsdf->ior;
@@ -67,6 +67,10 @@ ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3
 	float fresnel;
 	fresnel = fresnel_dielectric(m_eta, N, I, &R, &T,
 #ifdef __RAY_DIFFERENTIALS__
+#  ifdef __DNDU__
+		sd->dNdx,
+		sd->dNdy,
+#  endif
 		dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
 #endif
 		&inside);
diff --git a/intern/cycles/kernel/closure/bsdf_util.h b/intern/cycles/kernel/closure/bsdf_util.h
index 3dc15d5791c..dacc406cdab 100644
--- a/intern/cycles/kernel/closure/bsdf_util.h
+++ b/intern/cycles/kernel/closure/bsdf_util.h
@@ -40,6 +40,9 @@ ccl_device float fresnel_dielectric(
         const float3 I, float3 *R, float3 *T,
 #ifdef __RAY_DIFFERENTIALS__
         const float3 dIdx, const float3 dIdy,
+#  ifdef __DNDU__
+		const float3 dNdx, const float3 dNdy,
+#  endif
         float3 *dRdx, float3 *dRdy,
         float3 *dTdx, float3 *dTdy,
 #endif
@@ -64,14 +67,14 @@ ccl_device float fresnel_dielectric(
 	}
 	
 	// compute reflection
-	*R = (2 * cos)* Nn - I;
+	*R = (2.0f * cos)* Nn - I;
 #ifdef __RAY_DIFFERENTIALS__
-	*dRdx = (2 * dot(Nn, dIdx)) * Nn - dIdx;
-	*dRdy = (2 * dot(Nn, dIdy)) * Nn - dIdy;
+	*dRdx = (2.0f * dot(Nn, dIdx)) * Nn - dIdx;
+	*dRdy = (2.0f * dot(Nn, dIdy)) * Nn - dIdy;
 #endif
 	
 	float arg = 1 -(neta * neta *(1 -(cos * cos)));
-	if(arg < 0) {
+	if(arg < 0.0f) {
 		*T = make_float3(0.0f, 0.0f, 0.0f);
 #ifdef __RAY_DIFFERENTIALS__
 		*dTdx = make_float3(0.0f, 0.0f, 0.0f);
@@ -84,8 +87,16 @@ ccl_device float fresnel_dielectric(
 		float nK = (neta * cos)- dnp;
 		*T = -(neta * I)+(nK * Nn);
 #ifdef __RAY_DIFFERENTIALS__
-		*dTdx = -(neta * dIdx) + ((neta - neta * neta * cos / dnp) * dot(dIdx, Nn)) * Nn;
-		*dTdy = -(neta * dIdy) + ((neta - neta * neta * cos / dnp) * dot(dIdy, Nn)) * Nn;
+#  ifndef __DNDU__
+#    define dNdx make_float3(0.0f, 0.0f, 0.0f)
+#    define dNdy make_float3(0.0f, 0.0f, 0.0f)
+#  endif
+		float dDNdx = dot(dIdx, Nn) - dot(I, dNdx);
+		float dDNdy = dot(dIdy, Nn) - dot(I, dNdy);
+		float dmudx = (neta - neta * neta * cos / dnp) * dDNdx;
+		float dmudy = (neta - neta * neta * cos / dnp) * dDNdy;
+		*dTdx = -(neta * dIdx) + (nK * dNdx + dmudx * Nn);
+		*dTdy = -(neta * dIdy) + (nK * dNdy + dmudy * Nn);
 #endif
 		// compute Fresnel terms
 		float cosTheta1 = cos; // N.R
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index b3960b38fcf..9f24a2e6bdd 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1024,8 +1024,8 @@ typedef ccl_addr_space struct ShaderData {
 	float3 dPdu;
 	float3 dPdv;
 #endif
+#ifdef __DNDU__
 	/* differential of N w.r.t. x and y. */
-#ifdef __DPDU__
 	float3 dNdx;
 	float3 dNdy;
 #endif



More information about the Bf-blender-cvs mailing list