[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