diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2021-03-19 14:52:35 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2021-03-19 23:11:06 +0300 |
commit | 0a0f737f91dcbf280143c826780afe30dae811c9 (patch) | |
tree | 29d8a23f8b7e78c1c9b82537341090da432a6bea /source/blender/draw/engines/eevee/shaders | |
parent | 54f52cac7ccd92c82b9353fd7167f75461618dd7 (diff) |
EEVEE: Volumetrics: Add special attenuation volume for lights
This makes volume lights more efficient if they have lower power.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/lights_lib.glsl | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl index d2daa5a1092..0c26c8d1ff1 100644 --- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl @@ -251,7 +251,11 @@ float light_attenuation(LightData ld, vec4 l_vector) vis *= step(0.0, -dot(l_vector.xyz, ld.l_forward)); } if (ld.l_type != SUN) { +#ifdef VOLUME_LIGHTING + vis *= distance_attenuation(l_vector.w * l_vector.w, ld.l_influence_volume); +#else vis *= distance_attenuation(l_vector.w * l_vector.w, ld.l_influence); +#endif } return vis; } diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl index f75108babe6..dc755aeab8b 100644 --- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl @@ -40,18 +40,25 @@ void main() #ifdef VOLUME_LIGHTING /* Lights */ for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { - LightData ld = lights_data[i]; + if (ld.l_volume == 0.0) { + continue; + } + vec4 l_vector; l_vector.xyz = light_volume_light_vector(ld, P); l_vector.w = length(l_vector.xyz); - float Vis = light_visibility(ld, P, l_vector); + float vis = light_visibility(ld, P, l_vector); + + if (vis < 1e-4) { + continue; + } vec3 Li = light_volume(ld, l_vector) * light_volume_shadow(ld, P, l_vector, volumeExtinction); - outScattering.rgb += Li * Vis * s_scattering * + outScattering.rgb += Li * vis * s_scattering * phase_function(-V, l_vector.xyz / l_vector.w, s_anisotropy); } #endif |