diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl index 8c2d1f8a5cb..6d7ddd4e56e 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl @@ -90,6 +90,23 @@ vec3 light_volume_light_vector(LightData ld, vec3 P) if (ld.l_type == SUN) { return -ld.l_forward; } + else if (ld.l_type == AREA_RECT || ld.l_type == AREA_ELLIPSE) { + vec3 L = P - ld.l_position; + vec2 closest_point = vec2(dot(ld.l_right, L), dot(ld.l_up, L)); + vec2 max_pos = vec2(ld.l_sizex, ld.l_sizey); + closest_point /= max_pos; + + if (ld.l_type == AREA_ELLIPSE) { + closest_point /= max(1.0, length(closest_point)); + } + else { + closest_point = clamp(closest_point, -1.0, 1.0); + } + closest_point *= max_pos; + + vec3 L_prime = ld.l_right * closest_point.x + ld.l_up * closest_point.y; + return L_prime - L; + } else { return ld.l_position - P; } |