[Bf-blender-cvs] [4ec63b5421a] tmp-eevee-shadowmap-refactor: Eevee: Shadow: Speedup: Use only 2 sample for cascaded shadowmap

Clément Foucault noreply at git.blender.org
Mon Sep 2 16:53:24 CEST 2019


Commit: 4ec63b5421a4eae041c3c215697263868555b1ab
Author: Clément Foucault
Date:   Thu Aug 29 00:40:41 2019 +0200
Branches: tmp-eevee-shadowmap-refactor
https://developer.blender.org/rB4ec63b5421a4eae041c3c215697263868555b1ab

Eevee: Shadow: Speedup: Use only 2 sample for cascaded shadowmap

===================================================================

M	source/blender/draw/engines/eevee/shaders/lights_lib.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
index 23bf8b59648..9c1038cee6a 100644
--- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
@@ -80,55 +80,32 @@ float sample_cube_shadow(ShadowData sd, ShadowCubeData scd, float texid, vec3 W)
   return texture(shadowCubeTexture, vec4(coord, texid * 6.0 + face, dist));
 }
 
-float sample_cascade_shadow(ShadowData sd, mat4 shadowmat, mat4 shadowmat0, vec3 W, float texid)
+float sample_cascade_shadow(ShadowData sd, int scd_id, float texid, vec3 W)
 {
-  vec4 coord = shadowmat * vec4(W, 1.0);
-  return texture(shadowCascadeTexture, vec4(coord.xy, texid, coord.z));
-}
+/* Some driver poorly optimize this code. Use direct reference to matrices. */
+#define scd shadows_cascade_data[scd_id]
 
-float shadow_cascade(ShadowData sd, int scd_id, float texid, vec3 W)
-{
   vec4 view_z = vec4(dot(W - cameraPos, cameraForward));
-  vec4 weights = smoothstep(shadows_cascade_data[scd_id].split_end_distances,
-                            shadows_cascade_data[scd_id].split_start_distances.yzwx,
-                            view_z);
-
-  weights.yzw -= weights.xyz;
-
-  vec4 vis = vec4(1.0);
-
-  /* Branching using (weights > 0.0) is reaally slooow on intel so avoid it for now. */
-  /* TODO OPTI: Only do 2 samples and blend. */
-  vis.x = sample_cascade_shadow(sd,
-                                shadows_cascade_data[scd_id].shadowmat[0],
-                                shadows_cascade_data[scd_id].shadowmat[0],
-                                W,
-                                texid + 0);
-  vis.y = sample_cascade_shadow(sd,
-                                shadows_cascade_data[scd_id].shadowmat[1],
-                                shadows_cascade_data[scd_id].shadowmat[0],
-                                W,
-                                texid + 1);
-  vis.z = sample_cascade_shadow(sd,
-                                shadows_cascade_data[scd_id].shadowmat[2],
-                                shadows_cascade_data[scd_id].shadowmat[0],
-                                W,
-                                texid + 2);
-  vis.w = sample_cascade_shadow(sd,
-                                shadows_cascade_data[scd_id].shadowmat[3],
-                                shadows_cascade_data[scd_id].shadowmat[0],
-                                W,
-                                texid + 3);
-
-  float weight_sum = dot(vec4(1.0), weights);
-  if (weight_sum > 0.9999) {
-    float vis_sum = dot(vec4(1.0), vis * weights);
-    return vis_sum / weight_sum;
-  }
-  else {
-    float vis_sum = dot(vec4(1.0), vis * step(0.001, weights));
-    return mix(1.0, vis_sum, weight_sum);
-  }
+  vec4 weights = 1.0 - smoothstep(scd.split_end_distances, scd.split_start_distances.yzwx, view_z);
+  float tot_weight = dot(weights.xyz, vec3(1.0));
+
+  int cascade = int(clamp(tot_weight, 0.0, 3.0));
+  float blend = fract(tot_weight);
+  float vis = weights.w;
+  vec4 coord, shpos;
+  /* Main cascade. */
+  shpos = scd.shadowmat[cascade] * vec4(W, 1.0);
+  coord = vec4(shpos.xy, texid + float(cascade), shpos.z);
+  vis += texture(shadowCascadeTexture, coord) * (1.0 - blend);
+
+  cascade = min(3, cascade + 1);
+  /* Second cascade. */
+  shpos = scd.shadowmat[cascade] * vec4(W, 1.0);
+  coord = vec4(shpos.xy, texid + float(cascade), shpos.z);
+  vis += texture(shadowCascadeTexture, coord) * blend;
+
+#undef scd
+  return saturate(vis);
 }
 
 /* ----------------------------------------------------------- */
@@ -187,7 +164,7 @@ float light_visibility(LightData ld,
     ShadowData data = shadows_data[int(ld.l_shadowid)];
 
     if (ld.l_type == SUN) {
-      vis *= shadow_cascade(data, int(data.sh_data_start), data.sh_tex_start, W);
+      vis *= sample_cascade_shadow(data, int(data.sh_data_start), data.sh_tex_start, W);
     }
     else {
       vis *= sample_cube_shadow(



More information about the Bf-blender-cvs mailing list