diff options
Diffstat (limited to 'intern/cycles/kernel/kernel_light.h')
-rw-r--r-- | intern/cycles/kernel/kernel_light.h | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 1e99f2cb99f..fffa9afb342 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -510,7 +510,7 @@ ccl_device float lamp_light_pdf(KernelGlobals *kg, const float3 Ng, const float3 return t*t/cos_pi; } -ccl_device_inline void lamp_light_sample(KernelGlobals *kg, +ccl_device_inline bool lamp_light_sample(KernelGlobals *kg, int lamp, float randu, float randv, float3 P, @@ -581,6 +581,9 @@ ccl_device_inline void lamp_light_sample(KernelGlobals *kg, /* spot light attenuation */ float4 data2 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 2); ls->eval_fac *= spot_light_attenuation(data1, data2, ls); + if(ls->eval_fac == 0.0f) { + return false; + } } ls->pdf *= lamp_light_pdf(kg, ls->Ng, -ls->D, ls->t); } @@ -593,6 +596,10 @@ ccl_device_inline void lamp_light_sample(KernelGlobals *kg, float3 axisv = make_float3(data2.y, data2.z, data2.w); float3 D = make_float3(data3.y, data3.z, data3.w); + if(dot(ls->P - P, D) > 0.0f) { + return false; + } + ls->pdf = area_light_sample(P, &ls->P, axisu, axisv, randu, randv, @@ -603,13 +610,12 @@ ccl_device_inline void lamp_light_sample(KernelGlobals *kg, float invarea = data2.x; ls->eval_fac = 0.25f*invarea; - - if(dot(ls->D, D) > 0.0f) - ls->pdf = 0.0f; } ls->eval_fac *= kernel_data.integrator.inv_pdf_lights; } + + return (ls->pdf > 0.0f); } ccl_device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, float t, LightSample *ls) @@ -836,7 +842,7 @@ ccl_device bool light_select_reached_max_bounces(KernelGlobals *kg, int index, i return (bounce > __float_as_int(data4.x)); } -ccl_device_noinline void light_sample(KernelGlobals *kg, +ccl_device_noinline bool light_sample(KernelGlobals *kg, float randt, float randu, float randv, @@ -857,21 +863,20 @@ ccl_device_noinline void light_sample(KernelGlobals *kg, int shader_flag = __float_as_int(l.z); triangle_light_sample(kg, prim, object, randu, randv, time, ls); - /* compute incoming direction, distance and pdf */ ls->D = normalize_len(ls->P - P, &ls->t); ls->pdf = triangle_light_pdf(kg, ls->Ng, -ls->D, ls->t); ls->shader |= shader_flag; + return (ls->pdf > 0.0f); } else { int lamp = -prim-1; if(UNLIKELY(light_select_reached_max_bounces(kg, lamp, bounce))) { - ls->pdf = 0.0f; - return; + return false; } - lamp_light_sample(kg, lamp, randu, randv, P, ls); + return lamp_light_sample(kg, lamp, randu, randv, P, ls); } } |