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