[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