diff options
-rw-r--r-- | intern/cycles/kernel/kernel_emission.h | 48 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_light.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 6 |
3 files changed, 28 insertions, 27 deletions
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 8812bbb36ce..44899e0bf97 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -183,38 +183,42 @@ ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, Shader /* Indirect Lamp Emission */ -ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, PathState *state, Ray *ray, float randt, float3 *emission) +ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, PathState *state, Ray *ray, float3 *emission) { - LightSample ls; - int lamp = lamp_light_eval_sample(kg, randt); + bool hit_lamp = false; - if(lamp == LAMP_NONE) - return false; + *emission = make_float3(0.0f, 0.0f, 0.0f); - if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ray->t, &ls)) - return false; + for(int lamp = 0; lamp < kernel_data.integrator.num_all_lights; lamp++) { + LightSample ls; + + if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ray->t, &ls)) + continue; #ifdef __PASSES__ - /* use visibility flag to skip lights */ - if(ls.shader & SHADER_EXCLUDE_ANY) { - if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) || - ((ls.shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) || - ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT))) - return false; - } + /* use visibility flag to skip lights */ + if(ls.shader & SHADER_EXCLUDE_ANY) { + if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) || + ((ls.shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) || + ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT))) + continue; + } #endif - float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce); + float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce); - if(!(state->flag & PATH_RAY_MIS_SKIP)) { - /* multiple importance sampling, get regular light pdf, - * and compute weight with respect to BSDF pdf */ - float mis_weight = power_heuristic(state->ray_pdf, ls.pdf); - L *= mis_weight; + if(!(state->flag & PATH_RAY_MIS_SKIP)) { + /* multiple importance sampling, get regular light pdf, + * and compute weight with respect to BSDF pdf */ + float mis_weight = power_heuristic(state->ray_pdf, ls.pdf); + L *= mis_weight; + } + + *emission += L; + hit_lamp = true; } - *emission = L; - return true; + return hit_lamp; } /* Indirect Background */ diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index ffda44fee57..ac432d3fe04 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -421,7 +421,6 @@ ccl_device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D, /* compute pdf */ if(ls->t != FLT_MAX) ls->pdf *= lamp_light_pdf(kg, ls->Ng, -ls->D, ls->t); - ls->eval_fac *= kernel_data.integrator.inv_pdf_lights; return true; } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index f9dc9f3c50f..1ca6bd38ba9 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -240,10 +240,9 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, Ray ray, ccl_g light_ray.dP = ray.dP; /* intersect with lamp */ - float light_t = path_state_rng_1D(kg, rng, &state, PRNG_LIGHT); float3 emission; - if(indirect_lamp_emission(kg, &state, &light_ray, light_t, &emission)) + if(indirect_lamp_emission(kg, &state, &light_ray, &emission)) path_radiance_accum_emission(L, throughput, emission, state.bounce); } #endif @@ -624,10 +623,9 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, light_ray.dP = ray.dP; /* intersect with lamp */ - float light_t = path_state_rng_1D(kg, rng, &state, PRNG_LIGHT); float3 emission; - if(indirect_lamp_emission(kg, &state, &light_ray, light_t, &emission)) + if(indirect_lamp_emission(kg, &state, &light_ray, &emission)) path_radiance_accum_emission(&L, throughput, emission, state.bounce); } #endif |