[Bf-blender-cvs] [bfa29bb7044] cycles_texture_cache: Cycles: Improved ray differentials for volume scattering.
Stefan Werner
noreply at git.blender.org
Thu Sep 27 10:21:35 CEST 2018
Commit: bfa29bb70449fa2f098821b11c06571ffd37080d
Author: Stefan Werner
Date: Thu Sep 27 10:21:33 2018 +0200
Branches: cycles_texture_cache
https://developer.blender.org/rBbfa29bb70449fa2f098821b11c06571ffd37080d
Cycles: Improved ray differentials for volume scattering.
===================================================================
M intern/cycles/kernel/closure/volume.h
M intern/cycles/kernel/kernel_shader.h
===================================================================
diff --git a/intern/cycles/kernel/closure/volume.h b/intern/cycles/kernel/closure/volume.h
index 619c82226ce..16181f20e58 100644
--- a/intern/cycles/kernel/closure/volume.h
+++ b/intern/cycles/kernel/closure/volume.h
@@ -105,7 +105,9 @@ ccl_device float3 henyey_greenstrein_sample(float3 D, float g, float randu, floa
float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta);
float phi = M_2PI_F * randv;
- float3 dir = make_float3(sin_theta * cosf(phi), sin_theta * sinf(phi), cos_theta);
+ float cos_phi = cosf(phi);
+ float sin_phi = sinf(phi);
+ float3 dir = make_float3(sin_theta * cos_phi, sin_theta * sin_phi, cos_theta);
float3 T, B;
make_orthonormals(D, &T, &B);
@@ -113,12 +115,18 @@ ccl_device float3 henyey_greenstrein_sample(float3 D, float g, float randu, floa
#ifdef __RAY_DIFFERENTIALS__
if(domega_in_dx && domega_in_dy) {
- float cos_phi = cosf(phi);
- float sin_phi = sinf(phi);
- make_orthonormals(D - dIdx, &T, &B);
- *domega_in_dx = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (D - dIdx) - dir;
- make_orthonormals(D - dIdy, &T, &B);
- *domega_in_dy = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (D - dIdy) - dir;
+ if(pdf && *pdf < 1.0f) {
+ float spread = 0.125f / sqrtf(*pdf);
+ make_orthonormals(dir, &T, &B);
+ *domega_in_dx = spread * T;
+ *domega_in_dy = spread * B;
+ }
+ else {
+ make_orthonormals(D - dIdx, &T, &B);
+ *domega_in_dx = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (D - dIdx) - dir;
+ make_orthonormals(D - dIdy, &T, &B);
+ *domega_in_dy = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (D - dIdy) - dir;
+ }
}
#endif
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 31741591aeb..645e78f4c00 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -205,6 +205,11 @@ void shader_setup_from_subsurface(
sd->v = isect->v;
# endif
+# ifdef __DNDU__
+ sd->dNdx = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dNdy = make_float3(0.0f, 0.0f, 0.0f);
+# endif
+
/* fetch triangle data */
if(sd->type == PRIMITIVE_TRIANGLE) {
float3 Ng = triangle_normal(kg, sd);
@@ -224,10 +229,12 @@ void shader_setup_from_subsurface(
# endif
# ifdef __DNDU__
/* 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;
+ if(sd->shader & SHADER_SMOOTH_NORMAL && sd->type & PRIMITIVE_TRIANGLE) {
+ 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 {
@@ -555,8 +562,9 @@ ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *s
# ifdef __RAY_DIFFERENTIALS__
/* differentials */
- sd->dP = ray->dD;
- differential_incoming(&sd->dI, sd->dP);
+ sd->dP.dx = ray->dP.dx + ray->t * ray->dD.dx;
+ sd->dP.dy = ray->dP.dy+ ray->t * ray->dD.dy;
+ differential_incoming(&sd->dI, ray->dD);
sd->du = differential_zero();
sd->dv = differential_zero();
# endif
More information about the Bf-blender-cvs
mailing list