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:16:53 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-03-19 23:11:06 +0300
commit54f52cac7ccd92c82b9353fd7167f75461618dd7 (patch)
tree21c033d9ef271461d2d0c94265c813c1f34b23b1
parent884f934a853f7043a7e5a6ea380d560c858a78b7 (diff)
EEVEE: Volumetrics: Fix sun volumetric shadow
Sun lights are treated as distant light source and need to gather shadowing from the full frustum. This might have performance impact on certain scenes.
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl13
1 files changed, 13 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 5b747d66e4d..8c2d1f8a5cb 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
@@ -113,6 +113,19 @@ vec3 light_volume_shadow(LightData ld, vec3 ray_wpos, vec4 l_vector, sampler3D v
/* Heterogeneous volume shadows */
float dd = l_vector.w / volShadowSteps;
vec3 L = l_vector.xyz / volShadowSteps;
+
+ if (ld.l_type == SUN) {
+ /* For sun light we scan the whole frustum. So we need to get the correct endpoints. */
+ vec3 ndcP = project_point(ViewProjectionMatrix, ray_wpos);
+ vec3 ndcL = project_point(ViewProjectionMatrix, ray_wpos + l_vector.xyz) - ndcP;
+
+ vec3 frustum_isect = ndcP + ndcL * line_unit_box_intersect_dist_safe(ndcP, ndcL);
+
+ L = project_point(ViewProjectionMatrixInverse, frustum_isect) - ray_wpos;
+ L /= volShadowSteps;
+ dd = length(L);
+ }
+
vec3 shadow = vec3(1.0);
for (float s = 1.0; s < VOLUMETRIC_SHADOW_MAX_STEP && s <= volShadowSteps; s += 1.0) {
vec3 pos = ray_wpos + L * s;