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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to