forked from bartvdbraak/blender
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:
parent
0e97550fb3
commit
842a66b07c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user