diff options
author | Matteo Falduto <matteolegna> | 2021-04-01 06:35:56 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-04-01 13:31:01 +0300 |
commit | a4260ac21977acd5b9cd792f2a68c3aa78dd91cd (patch) | |
tree | 61bdd5358e5279ddb9c13c53bb3079d1d8f79b65 /intern/cycles/kernel/kernel_light_common.h | |
parent | c859e1afa0dcca1a495c6b25d00bab65bf94be0b (diff) |
Cycles: add a spread setting for area lights
This simulates the effect of a honeycomb or grid placed in front of a softbox.
In practice, it works by attenuating rays coming off-angle as a function of the
provided spread angle parameter.
Setting the parameter to 180 degrees poses no restrictions to the rays, making
the light behave the same way as before this patch.
The total light power is normalized based on the spread angle, so that the
light strength remains the same.
Differential Revision: https://developer.blender.org/D10594
Diffstat (limited to 'intern/cycles/kernel/kernel_light_common.h')
-rw-r--r-- | intern/cycles/kernel/kernel_light_common.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/intern/cycles/kernel/kernel_light_common.h b/intern/cycles/kernel/kernel_light_common.h index 39503a4b479..7efd1e74202 100644 --- a/intern/cycles/kernel/kernel_light_common.h +++ b/intern/cycles/kernel/kernel_light_common.h @@ -146,6 +146,17 @@ ccl_device float spot_light_attenuation(float3 dir, float spot_angle, float spot return attenuation; } +ccl_device float light_spread_attenuation(const float3 D, + const float3 Ng, + const float tan_spread, + const float normalize_spread) +{ + const float cos_a = -dot(D, Ng); + const float sin_a = safe_sqrtf(1.0f - sqr(cos_a)); + const float tan_a = sin_a / cos_a; + return max((1.0f - (tan_spread * tan_a)) * normalize_spread, 0.0f); +} + ccl_device float lamp_light_pdf(KernelGlobals *kg, const float3 Ng, const float3 I, float t) { float cos_pi = dot(Ng, I); |