[Bf-blender-cvs] [6d47a91220a] upstream_cycles_texture_cache: Cycles: fixed normal differentials, ShaderData now contains dNdx/y instead of dNdu/v

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


Commit: 6d47a91220ac6aba272266a95d9daae4b69a3100
Author: Stefan Werner
Date:   Fri Jul 14 20:12:35 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rB6d47a91220ac6aba272266a95d9daae4b69a3100

Cycles: fixed normal differentials, ShaderData now contains dNdx/y instead of dNdu/v

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

M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/closure/bsdf_reflection.h
M	intern/cycles/kernel/geom/geom_curve_intersect.h
M	intern/cycles/kernel/geom/geom_motion_triangle_shader.h
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index ff17905806f..32af606d450 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -684,14 +684,12 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
 
 #ifdef __RAY_DIFFERENTIALS__
 #ifdef __DNDU__
-					float3 dndx = sd->dNdu * sd->du.dx + sd->dNdv * sd->dv.dx;
-					float3 dndy = sd->dNdu * sd->du.dy + sd->dNdv * sd->dv.dy;
 					float3 dwodx = -dIdx;
 					float3 dwody = -dIdy;
-					float dDNdx = dot(dwodx, N) + dot(I, dndx);
-					float dDNdy = dot(dwody, N) + dot(I, dndy);
-					*domega_in_dx = dwodx + 2.f * (dot(I, N) * dndx + dDNdx * N);
-					*domega_in_dy = dwody + 2.f * (dot(I, N) * dndy + dDNdy * N);
+					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);
 #else
 					*domega_in_dx = (2.0f * dot(m, dIdx)) * m - dIdx;
 					*domega_in_dy = (2.0f * dot(m, dIdy)) * m - dIdy;
@@ -1064,14 +1062,12 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
 
 #ifdef __RAY_DIFFERENTIALS__
 #ifdef __DNDU__
-					float3 dndx = sd->dNdu * sd->du.dx + sd->dNdv * sd->dv.dx;
-					float3 dndy = sd->dNdu * sd->du.dy + sd->dNdv * sd->dv.dy;
 					float3 dwodx = -dIdx;
 					float3 dwody = -dIdy;
-					float dDNdx = dot(dwodx, N) + dot(I, dndx);
-					float dDNdy = dot(dwody, N) + dot(I, dndy);
-					*domega_in_dx = dwodx + 2.f * (dot(I, N) * dndx + dDNdx * N);
-					*domega_in_dy = dwody + 2.f * (dot(I, N) * dndy + dDNdy * N);
+					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);
 #else
 					*domega_in_dx = (2.0f * dot(m, dIdx)) * m - dIdx;
 					*domega_in_dy = (2.0f * dot(m, dIdy)) * m - dIdy;
diff --git a/intern/cycles/kernel/closure/bsdf_reflection.h b/intern/cycles/kernel/closure/bsdf_reflection.h
index ffccb3695f6..921700085e3 100644
--- a/intern/cycles/kernel/closure/bsdf_reflection.h
+++ b/intern/cycles/kernel/closure/bsdf_reflection.h
@@ -66,14 +66,12 @@ ccl_device int bsdf_reflection_sample(const ShaderClosure *sc, float3 Ng, float3
 #ifdef __RAY_DIFFERENTIALS__
 #ifdef __DNDU__
 			/* as described in pbrt */
-			float3 dndx = sd->dNdu * sd->du.dx + sd->dNdv * sd->dv.dx;
-			float3 dndy = sd->dNdu * sd->du.dy + sd->dNdv * sd->dv.dy;
 			float3 dwodx = -dIdx;
 			float3 dwody = -dIdy;
-			float dDNdx = dot(dwodx, N) + dot(I, dndx);
-			float dDNdy = dot(dwody, N) + dot(I, dndy);
-			*domega_in_dx = dwodx + 2.f * (dot(I, N) * dndx + dDNdx * N);
-			*domega_in_dy = dwody + 2.f * (dot(I, N) * dndy + dDNdy * N);
+			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);
 #else
 			*domega_in_dx = 2.0f * dot(N, dIdx) * N - dIdx;
 			*domega_in_dy = 2.0f * dot(N, dIdy) * N - dIdy;
diff --git a/intern/cycles/kernel/geom/geom_curve_intersect.h b/intern/cycles/kernel/geom/geom_curve_intersect.h
index 9e08d023c14..b6b90767749 100644
--- a/intern/cycles/kernel/geom/geom_curve_intersect.h
+++ b/intern/cycles/kernel/geom/geom_curve_intersect.h
@@ -909,8 +909,8 @@ ccl_device_inline float3 curve_refine(KernelGlobals *kg,
 	sd->dPdv = cross(tg, sd->Ng);
 #endif
 #ifdef __DNDU__
-	sd->dNdu = make_float3(0.0f, 0.0f, 0.0f);
-	sd->dNdv = make_float3(0.0f, 0.0f, 0.0f);
+	sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+	sd->dNdy = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
 	if(isect->object != OBJECT_NONE) {
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle_shader.h b/intern/cycles/kernel/geom/geom_motion_triangle_shader.h
index 588bf658ac9..cb65e415bf1 100644
--- a/intern/cycles/kernel/geom/geom_motion_triangle_shader.h
+++ b/intern/cycles/kernel/geom/geom_motion_triangle_shader.h
@@ -117,16 +117,6 @@ ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg,
 		float v = sd->v;
 		float w = 1.0f - u - v;
 		sd->N = (u*normals[0] + v*normals[1] + w*normals[2]);
-#ifdef __DNDU__
-		sd->dNdu = (normals[0] - normals[2]);
-		sd->dNdv = (normals[1] - normals[2]);
-#endif
-	}
-	else {
-#ifdef __DNDU__
-		sd->dNdu = make_float3(0.0f, 0.0f, 0.0f);
-		sd->dNdv = make_float3(0.0f, 0.0f, 0.0f);
-#endif
 	}
 }
 
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 24239317859..5c1bbda3add 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -98,8 +98,8 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg,
 	differential3 dD;
 	differential3 dN;
 #ifdef __DNDU__
-	dN.dx = sd->dNdu;
-	dN.dy = sd->dNdv;
+	dN.dx = sd->dNdx;
+	dN.dy = sd->dNdy;
 #else
 	dN = differential3_zero();
 #endif
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index aeb67c7ff1a..b6d4d9b2407 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -105,10 +105,6 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
 #ifdef __DPDU__
 		/* dPdu/dPdv */
 		triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
-#endif
-#ifdef __DNDU__
-		/* dNdu/dNdv */
-		triangle_dNdudv(kg, sd->prim, &sd->dNdu, &sd->dNdv);
 #endif
 	}
 	else {
@@ -129,11 +125,6 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
 		object_dir_transform_auto(kg, sd, &sd->dPdu);
 		object_dir_transform_auto(kg, sd, &sd->dPdv);
 #  endif
-#  ifdef __DNDU__
-		object_dir_transform_auto(kg, sd, &sd->dNdu);
-		object_dir_transform_auto(kg, sd, &sd->dNdv);
-#  endif
-
 	}
 #endif
 
@@ -147,10 +138,6 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
 #ifdef __DPDU__
 		sd->dPdu = -sd->dPdu;
 		sd->dPdv = -sd->dPdv;
-#endif
-#ifdef __DNDU__
-		sd->dNdu = -sd->dNdu;
-		sd->dNdv = -sd->dNdv;
 #endif
 	}
 
@@ -159,6 +146,34 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
 	differential_transfer(&sd->dP, ray->dP, ray->D, ray->dD, sd->Ng, isect->t);
 	differential_incoming(&sd->dI, ray->dD);
 	differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
+#  ifdef __DNDU__
+	if(sd->type & PRIMITIVE_TRIANGLE) {
+		/* dNdu/dNdv */
+		float3 dNdu, dNdv;
+		triangle_dNdudv(kg, sd->prim, &dNdu, &dNdv);
+		sd->dNdx = dNdu * sd->du.dx + dNdv * sd->dv.dx;
+		sd->dNdy = dNdu * sd->du.dy + dNdv * sd->dv.dy;
+		
+		
+		/* backfacing test */
+		bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
+		if(backfacing) {
+			sd->dNdx = -sd->dNdx;
+			sd->dNdy = -sd->dNdy;
+		}
+#    ifdef __INSTANCING__
+		if(isect->object != OBJECT_NONE) {
+			/* instance transform */
+			object_dir_transform_auto(kg, sd, &sd->dNdx);
+			object_dir_transform_auto(kg, sd, &sd->dNdy);
+		}
+#    endif /* __INSTANCING__ */
+	}
+	else {
+		sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+		sd->dNdy = make_float3(0.0f, 0.0f, 0.0f);
+	}
+#  endif /* __DNDU__ */
 #endif
 }
 
@@ -208,7 +223,10 @@ void shader_setup_from_subsurface(
 #  endif
 #  ifdef __DNDU__
 		/* dNdu/dNdv */
-		triangle_dNdudv(kg, sd->prim, &sd->dNdu, &sd->dNdv);
+		float3 dNdu, dNdv;
+		triangle_dNdudv(kg, sd->prim, &dNdu, &dNdv);
+		sd->dNdx = dNdu * sd->du.dx + dNdv * sd->dv.dx;
+		sd->dNdy = dNdu * sd->du.dy + dNdv * sd->dv.dy;
 #  endif
 	}
 	else {
@@ -228,8 +246,8 @@ void shader_setup_from_subsurface(
 		object_dir_transform_auto(kg, sd, &sd->dPdv);
 #    endif
 #    ifdef __DNDU__
-		object_dir_transform(kg, sd, &sd->dNdu);
-		object_dir_transform(kg, sd, &sd->dNdv);
+		object_dir_transform(kg, sd, &sd->dNdx);
+		object_dir_transform(kg, sd, &sd->dNdy);
 #    endif
 	}
 #  endif
@@ -244,8 +262,8 @@ void shader_setup_from_subsurface(
 		sd->dPdv = -sd->dPdv;
 #  endif
 #  ifdef __DNDU__
-		sd->dNdu = -sd->dNdu;
-		sd->dNdv = -sd->dNdv;
+		sd->dNdx = -sd->dNdx;
+		sd->dNdy = -sd->dNdy;
 #  endif
 	}
 
@@ -350,12 +368,16 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
 #  endif
 #endif
 #ifdef __DNDU__
-		triangle_dNdudv(kg, sd->prim, &sd->dNdu, &sd->dNdv);
+
+		float3 dNdu, dNdv;
+		triangle_dNdudv(kg, sd->prim, &dNdu, &dNdv);
+		sd->dNdx = dNdu * sd->du.dx + dNdv * sd->dv.dx;
+		sd->dNdy = dNdu * sd->du.dy + dNdv * sd->dv.dy;
 
 #  ifdef __INSTANCING__
 		if(!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
-			object_normal_transform_auto(kg, sd, &sd->dNdu);
-			object_normal_transform_auto(kg, sd, &sd->dNdv);
+			object_normal_transform_auto(kg, sd, &sd->dNdx);
+			object_normal_transform_auto(kg, sd, &sd->dNdy);
 		}
 #  endif
 #endif
@@ -365,8 +387,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
 		lamp_light_dPdudv(kg, lamp, sd->u, sd->v, &sd->dPdu, &sd->dPdv);
 #endif
 #ifdef __DNDU__
-		sd->dNdu = make_float3(0.0f, 0.0f, 0.0f);
-		sd->dNdv = make_float3(0.0f, 0.0f, 0.0f);
+		sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+		sd->dNdy = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 	}
 	else {
@@ -375,8 +397,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
 		sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 #ifdef __DNDU__
-		sd->dNdu = make_float3(0.0f, 0.0f, 0.0f);
-		sd->dNdv = make_float3(0.0f, 0.0f, 0.0f);
+		sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+		sd->dNdy = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 	}
 
@@ -393,8 +415,8 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
 			sd->dPdv = -sd->dPdv;
 #endif
 #ifdef __DNDU__
-			sd->dNdu = -sd->dNdu;
-			sd->dNdv = -sd->dNdv;
+			sd->dNdx = -sd->dNdx;
+			sd->dNdx = -sd->dNdx;
 #endif
 		}
 	}
@@ -467,8 +489,8 @@ ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderDat
 	sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 #ifdef __DNDU__
-	sd->dNdu = make_float3(0.0f, 0.0f, 0.0f);
-	sd->dNdv = make_float3(0.0f, 0.0f, 0.0f);
+	sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+	sd->dNdy = make_float3(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list