[Bf-blender-cvs] [d4dd872d56b] blender2.8: Eevee: Simplify shadow test code with macros.
Clément Foucault
noreply at git.blender.org
Fri May 4 16:22:25 CEST 2018
Commit: d4dd872d56b34f9ce0b03d570cddff52460b5b0f
Author: Clément Foucault
Date: Fri May 4 11:22:21 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd4dd872d56b34f9ce0b03d570cddff52460b5b0f
Eevee: Simplify shadow test code with macros.
===================================================================
M source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
===================================================================
diff --git a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
index 6b765b1d263..432fa33b291 100644
--- a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
@@ -20,21 +20,33 @@ layout(std140) uniform light_block {
#define HEMI 3.0
#define AREA 4.0
+#if defined(SHADOW_VSM)
+#define ShadowSample vec2
+#define sample_cube(vec, id) texture_octahedron(shadowTexture, vec4(vec, id)).rg
+#define sample_cascade(vec, id) texture(shadowTexture, vec3(vec, id)).rg
+#elif defined(SHADOW_ESM)
+#define ShadowSample float
+#define sample_cube(vec, id) texture_octahedron(shadowTexture, vec4(vec, id)).r
+#define sample_cascade(vec, id) texture(shadowTexture, vec3(vec, id)).r
+#else
+#define ShadowSample float
+#define sample_cube(vec, id) texture_octahedron(shadowTexture, vec4(vec, id)).r
+#define sample_cascade(vec, id) texture(shadowTexture, vec3(vec, id)).r
+#endif
+
+#if defined(SHADOW_VSM)
+#define get_depth_delta(s) (dist - s.x)
+#else
+#define get_depth_delta(s) (dist - s)
+#endif
+
/* ----------------------------------------------------------- */
/* ----------------------- Shadow tests ---------------------- */
/* ----------------------------------------------------------- */
-float shadow_test_esm(float z, float dist, float exponent)
-{
- return saturate(exp(exponent * (z - dist)));
-}
-
-float shadow_test_pcf(float z, float dist)
-{
- return step(0, z - dist);
-}
+#if defined(SHADOW_VSM)
-float shadow_test_vsm(vec2 moments, float dist, float bias, float bleed_bias)
+float shadow_test(ShadowSample moments, float dist, ShadowData sd)
{
float p = 0.0;
@@ -42,17 +54,32 @@ float shadow_test_vsm(vec2 moments, float dist, float bias, float bleed_bias)
p = 1.0;
float variance = moments.y - (moments.x * moments.x);
- variance = max(variance, bias / 10.0);
+ variance = max(variance, sd.sh_bias / 10.0);
float d = moments.x - dist;
float p_max = variance / (variance + d * d);
/* Now reduce light-bleeding by removing the [0, x] tail and linearly rescaling (x, 1] */
- p_max = clamp((p_max - bleed_bias) / (1.0 - bleed_bias), 0.0, 1.0);
+ p_max = clamp((p_max - sd.sh_bleed) / (1.0 - sd.sh_bleed), 0.0, 1.0);
return max(p, p_max);
}
+#elif defined(SHADOW_ESM)
+
+float shadow_test(ShadowSample z, float dist, ShadowData sd)
+{
+ return saturate(exp(sd.sh_exp * (z - dist + sd.sh_bias)));
+}
+
+#else
+
+float shadow_test(ShadowSample z, float dist, ShadowData sd)
+{
+ return step(0, z - dist + sd.sh_bias);
+}
+
+#endif
/* ----------------------------------------------------------- */
/* ----------------------- Shadow types ---------------------- */
@@ -71,19 +98,8 @@ float shadow_cubemap(ShadowData sd, ShadowCubeData scd, float texid, vec3 W)
cubevec /= dist;
-#if defined(SHADOW_VSM)
- vec2 moments = texture_octahedron(shadowTexture, vec4(cubevec, texid)).rg;
-#else
- float z = texture_octahedron(shadowTexture, vec4(cubevec, texid)).r;
-#endif
-
-#if defined(SHADOW_VSM)
- return shadow_test_vsm(moments, dist, sd.sh_bias, sd.sh_bleed);
-#elif defined(SHADOW_ESM)
- return shadow_test_esm(z, dist - sd.sh_bias, sd.sh_exp);
-#else
- return shadow_test_pcf(z, dist - sd.sh_bias);
-#endif
+ ShadowSample s = sample_cube(cubevec, texid);
+ return shadow_test(s, dist, sd);
}
float evaluate_cascade(ShadowData sd, mat4 shadowmat, vec3 W, float range, float texid)
@@ -91,20 +107,8 @@ float evaluate_cascade(ShadowData sd, mat4 shadowmat, vec3 W, float range, float
vec4 shpos = shadowmat * vec4(W, 1.0);
float dist = shpos.z * range;
-#if defined(SHADOW_VSM)
- vec2 moments = texture(shadowTexture, vec3(shpos.xy, texid)).rg;
-#else
- float z = texture(shadowTexture, vec3(shpos.xy, texid)).r;
-#endif
-
- float vis;
-#if defined(SHADOW_VSM)
- vis = shadow_test_vsm(moments, dist, sd.sh_bias, sd.sh_bleed);
-#elif defined(SHADOW_ESM)
- vis = shadow_test_esm(z, dist - sd.sh_bias, sd.sh_exp);
-#else
- vis = shadow_test_pcf(z, dist - sd.sh_bias);
-#endif
+ ShadowSample s = sample_cascade(shpos.xy, texid);
+ float vis = shadow_test(s, dist, sd);
/* If fragment is out of shadowmap range, do not occlude */
if (shpos.z < 1.0 && shpos.z > 0.0) {
@@ -125,6 +129,7 @@ float shadow_cascade(ShadowData sd, ShadowCascadeData scd, float texid, vec3 W)
float range = abs(sd.sh_far - sd.sh_near); /* Same factor as in get_cascade_world_distance(). */
/* 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 = evaluate_cascade(sd, scd.shadowmat[0], W, range, texid + 0);
vis.y = evaluate_cascade(sd, scd.shadowmat[1], W, range, texid + 1);
vis.z = evaluate_cascade(sd, scd.shadowmat[2], W, range, texid + 2);
@@ -346,13 +351,8 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, float scale)
return vec3(0.0);
}
-#if defined(SHADOW_VSM)
- vec2 moments = texture(shadowTexture, vec3(shpos.xy, data.sh_tex_start + id)).rg;
- delta = dist - moments.x;
-#else
- float z = texture(shadowTexture, vec3(shpos.xy, data.sh_tex_start + id)).r;
- delta = dist - z;
-#endif
+ ShadowSample s = sample_cascade(shpos.xy, data.sh_tex_start + id);
+ delta = get_depth_delta(s);
}
else {
vec3 cubevec = W - shadows_cube_data[int(data.sh_data_start)].position.xyz;
@@ -364,13 +364,8 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, float scale)
if (dist < data.sh_far) {
cubevec /= dist;
-#if defined(SHADOW_VSM)
- vec2 moments = texture_octahedron(shadowTexture, vec4(cubevec, data.sh_tex_start)).rg;
- delta = dist - moments.x;
-#else
- float z = texture_octahedron(shadowTexture, vec4(cubevec, data.sh_tex_start)).r;
- delta = dist - z;
-#endif
+ ShadowSample s = sample_cube(cubevec, data.sh_tex_start);
+ delta = get_depth_delta(s);
}
}
More information about the Bf-blender-cvs
mailing list