[Bf-blender-cvs] [a0d7db5] master: Cycles: Small tweaks for Henyey Greenstein closure code.

Thomas Dinges noreply at git.blender.org
Tue Feb 17 17:48:48 CET 2015


Commit: a0d7db503d82c1a5b56a5723da90364f11569b37
Author: Thomas Dinges
Date:   Tue Feb 17 17:44:32 2015 +0100
Branches: master
https://developer.blender.org/rBa0d7db503d82c1a5b56a5723da90364f11569b37

Cycles: Small tweaks for Henyey Greenstein closure code.

* Avoid duplicative fabs(g) check in sample code.
* Avoid dot product in eval code.

Helps like ~1% when Scatter Anisotropy is 0.

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

M	intern/cycles/kernel/closure/volume.h
M	intern/cycles/kernel/svm/svm_closure.h

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

diff --git a/intern/cycles/kernel/closure/volume.h b/intern/cycles/kernel/closure/volume.h
index 9f519e2..1cf5e17 100644
--- a/intern/cycles/kernel/closure/volume.h
+++ b/intern/cycles/kernel/closure/volume.h
@@ -26,9 +26,6 @@ CCL_NAMESPACE_BEGIN
  * uniform sphere. g=0 uniform diffuse-like, g=1 close to sharp single ray. */
 ccl_device float single_peaked_henyey_greenstein(float cos_theta, float g)
 {
-	if(fabsf(g) < 1e-3f)
-		return M_1_PI_F * 0.25f;
-	
 	return ((1.0f - g * g) / safe_powf(1.0f + g * g - 2.0f * g * cos_theta, 1.5f)) * (M_1_PI_F * 0.25f);
 };
 
@@ -47,9 +44,13 @@ ccl_device float3 volume_henyey_greenstein_eval_phase(const ShaderClosure *sc, c
 	float g = sc->data0;
 
 	/* note that I points towards the viewer */
-	float cos_theta = dot(-I, omega_in);
-
-	*pdf = single_peaked_henyey_greenstein(cos_theta, g);
+	if(fabsf(g) < 1e-3f) {
+		*pdf = M_1_PI_F * 0.25f;
+	}
+	else {
+		float cos_theta = dot(-I, omega_in);
+		*pdf = single_peaked_henyey_greenstein(cos_theta, g);
+	}
 
 	return make_float3(*pdf, *pdf, *pdf);
 }
@@ -63,10 +64,12 @@ ccl_device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 I
 	/* match pdf for small g */
 	if(fabsf(g) < 1e-3f) {
 		cos_theta = (1.0f - 2.0f * randu);
+		*pdf = M_1_PI_F * 0.25f;
 	}
 	else {
 		float k = (1.0f - g * g) / (1.0f - g + 2.0f * g * randu);
 		cos_theta = (1.0f + g * g - k * k) / (2.0f * g);
+		*pdf = single_peaked_henyey_greenstein(cos_theta, g);
 	}
 
 	float sin_theta = safe_sqrtf(1.0f - cos_theta * cos_theta);
@@ -80,7 +83,6 @@ ccl_device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 I
 	make_orthonormals(-I, &T, &B);
 	*omega_in = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (-I);
 
-	*pdf = single_peaked_henyey_greenstein(cos_theta, g);
 	*eval = make_float3(*pdf, *pdf, *pdf); /* perfect importance sampling */
 
 #ifdef __RAY_DIFFERENTIALS__
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index ed3f277..07ac710 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -528,8 +528,7 @@ ccl_device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float
 			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight * density);
 
 			if(sc) {
-				float g = param2;
-				sc->data0 = g;
+				sc->data0 = param2; /* g */
 				sd->flag |= volume_henyey_greenstein_setup(sc);
 			}
 			break;




More information about the Bf-blender-cvs mailing list