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)
{
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);
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;
/* 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);
/* 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);
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);
L->emission = make_float3(0.0f, 0.0f, 0.0f);
}
#endif
}
return L_sum;
}
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);
#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);