[Bf-blender-cvs] [842a66b] master: Cycles: Code refactor for Clamping/Inf Rejection, combined into 1 function. Also avoid some conditionals.

Thomas Dinges noreply at git.blender.org
Tue Feb 11 17:44:54 CET 2014


Commit: 842a66b07cc1092975191eb3110f484b5d1fd787
Author: Thomas Dinges
Date:   Tue Feb 11 17:44:21 2014 +0100
https://developer.blender.org/rB842a66b07cc1092975191eb3110f484b5d1fd787

Cycles: Code refactor for Clamping/Inf Rejection, combined into 1 function. Also avoid some conditionals.

Reviewed by: brecht
Differential Revision: https://developer.blender.org/D310

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

M	intern/cycles/kernel/kernel_accumulate.h
M	intern/cycles/kernel/kernel_path.h

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

diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index a8563f9..582a220 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -318,21 +318,44 @@ ccl_device_inline void path_radiance_reset_indirect(PathRadiance *L)
 
 ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadiance *L)
 {
+	float3 L_sum, L_direct, L_indirect;
+	float clamp_direct = kernel_data.integrator.sample_clamp_direct;
+	float clamp_indirect = kernel_data.integrator.sample_clamp_indirect;
+
+	/* Light Passes are used */
 #ifdef __PASSES__
 	if(L->use_light_pass) {
 		path_radiance_sum_indirect(L);
 
-		float3 L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->emission;
-		float3 L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface;
-		
+		L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->emission;
+		L_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface;
+
 		if(!kernel_data.background.transparent)
 			L_direct += L->background;
 
-#ifdef __CLAMP_SAMPLE__ 
-		float clamp_direct = kernel_data.integrator.sample_clamp_direct;
-		float clamp_indirect = kernel_data.integrator.sample_clamp_indirect;
+		L_sum = L_direct + L_indirect;
+		float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z);
+
+		/* Reject invalid value */
+		if(!isfinite(sum)) {
+			L_sum = make_float3(0.0f, 0.0f, 0.0f);
+
+			L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+			L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
+			L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
+			L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
+
+			L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+			L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
+			L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
+			L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
 
-		if(clamp_direct != FLT_MAX || clamp_indirect != FLT_MAX) {
+			L->emission = make_float3(0.0f, 0.0f, 0.0f);
+		}
+
+		/* Clamp direct and indirect samples */
+#ifdef __CLAMP_SAMPLE__
+		else if(sum > clamp_direct || sum > clamp_indirect) {
 			float scale;
 
 			/* Direct */
@@ -360,44 +383,28 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
 				L->indirect_transmission *= scale;
 				L->indirect_subsurface *= scale;
 			}
+
+			/* Sum again, after clamping */
+			L_sum = L_direct + L_indirect;
 		}
 #endif
-		/* Combine */
-		float3 L_sum = L_direct + L_indirect;
 
 		return L_sum;
 	}
+
+	/* No Light Passes */
 	else
-		return L->emission;
+		L_sum = L->emission;
 #else
-	return *L;
+	L_sum = *L;
 #endif
-}
-
-ccl_device_inline void path_radiance_reject(PathRadiance *L, float3 *L_sum)
-{
-	float sum = fabsf((*L_sum).x) + fabsf((*L_sum).y) + fabsf((*L_sum).z);
-
-	if(!isfinite(sum)) {
-		/* invalid value, reject */
-		*L_sum = make_float3(0.0f, 0.0f, 0.0f);
-
-#ifdef __PASSES__
-		if(L->use_light_pass) {
-			L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
-			L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
-			L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
-			L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f);
 
-			L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
-			L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
-			L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
-			L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f);
+	/* Reject invalid value */
+	float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z);
+	if(!isfinite(sum))
+		L_sum = make_float3(0.0f, 0.0f, 0.0f);
 
-			L->emission = make_float3(0.0f, 0.0f, 0.0f);
-		}
-#endif
-	}
+	return L_sum;
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 77bc204..6352014 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -886,10 +886,6 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 
 	float3 L_sum = path_radiance_clamp_and_sum(kg, &L);
 
-#ifdef __CLAMP_SAMPLE__
-	path_radiance_reject(&L, &L_sum);
-#endif
-
 	kernel_write_light_passes(kg, buffer, &L, sample);
 
 	return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent);
@@ -1322,10 +1318,6 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
 
 	float3 L_sum = path_radiance_clamp_and_sum(kg, &L);
 
-#ifdef __CLAMP_SAMPLE__
-	path_radiance_reject(&L, &L_sum);
-#endif
-
 	kernel_write_light_passes(kg, buffer, &L, sample);
 
 	return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent);




More information about the Bf-blender-cvs mailing list