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
This commit is contained in:
Thomas Dinges 2014-02-11 17:44:21 +01:00
parent 0e97550fb3
commit 842a66b07c
2 changed files with 42 additions and 43 deletions

@ -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) 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__ #ifdef __PASSES__
if(L->use_light_pass) { if(L->use_light_pass) {
path_radiance_sum_indirect(L); path_radiance_sum_indirect(L);
float3 L_direct = L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + L->emission; 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_indirect = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface;
if(!kernel_data.background.transparent) if(!kernel_data.background.transparent)
L_direct += L->background; L_direct += L->background;
#ifdef __CLAMP_SAMPLE__ L_sum = L_direct + L_indirect;
float clamp_direct = kernel_data.integrator.sample_clamp_direct; float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z);
float clamp_indirect = kernel_data.integrator.sample_clamp_indirect;
if(clamp_direct != FLT_MAX || clamp_indirect != FLT_MAX) { /* 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);
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; float scale;
/* Direct */ /* Direct */
@ -360,44 +383,28 @@ ccl_device_inline float3 path_radiance_clamp_and_sum(KernelGlobals *kg, PathRadi
L->indirect_transmission *= scale; L->indirect_transmission *= scale;
L->indirect_subsurface *= scale; L->indirect_subsurface *= scale;
} }
/* Sum again, after clamping */
L_sum = L_direct + L_indirect;
} }
#endif #endif
/* Combine */
float3 L_sum = L_direct + L_indirect;
return L_sum; return L_sum;
} }
/* No Light Passes */
else else
return L->emission; L_sum = L->emission;
#else #else
return *L; L_sum = *L;
#endif #endif
}
ccl_device_inline void path_radiance_reject(PathRadiance *L, float3 *L_sum) /* Reject invalid value */
{ float sum = fabsf((L_sum).x) + fabsf((L_sum).y) + fabsf((L_sum).z);
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);
if(!isfinite(sum)) { return L_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);
L->emission = make_float3(0.0f, 0.0f, 0.0f);
}
#endif
}
} }
CCL_NAMESPACE_END CCL_NAMESPACE_END

@ -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); 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); kernel_write_light_passes(kg, buffer, &L, sample);
return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent); 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); 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); kernel_write_light_passes(kg, buffer, &L, sample);
return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent); return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent);