Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2014-02-11 20:44:21 +0400
committerThomas Dinges <blender@dingto.org>2014-02-11 20:44:41 +0400
commit842a66b07cc1092975191eb3110f484b5d1fd787 (patch)
tree3829e806530dc1527bc3cfb09556bdb91492dab8 /intern
parent0e97550fb31e3c7edb11fd6739c2d87401419fbb (diff)
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
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/kernel_accumulate.h77
-rw-r--r--intern/cycles/kernel/kernel_path.h8
2 files changed, 42 insertions, 43 deletions
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index a8563f9a501..582a220ab3c 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 77bc20468f4..635201471e1 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);