Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2021-03-19 14:52:35 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-03-19 23:11:06 +0300
commit0a0f737f91dcbf280143c826780afe30dae811c9 (patch)
tree29d8a23f8b7e78c1c9b82537341090da432a6bea /source/blender/draw/engines/eevee/shaders
parent54f52cac7ccd92c82b9353fd7167f75461618dd7 (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.glsl4
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl13
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