From 36946a47febba47fd3c53e601bcf41476440da0c Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 4 Oct 2018 00:46:17 +0200 Subject: [PATCH] - fix diagonal linear shadow map artifact --- wadsrc/static/shaders/glsl/main.fp | 10 ++++++---- wadsrc/static/shaders/glsl/shadowmap.fp | 11 ++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index c78bb0e02..219e01581 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -162,17 +162,19 @@ float shadowDirToU(vec2 dir) { if (abs(dir.x) > abs(dir.y)) { + float v = dir.y / dir.x * 0.125; if (dir.x >= 0.0) - return dir.y / dir.x * 0.125 + (0.25 + 0.125); + return (0.25 + 0.125) - v; else - return dir.y / dir.x * 0.125 + (0.75 + 0.125); + return (0.75 + 0.125) - v; } else { + float v = dir.x / dir.y * 0.125; if (dir.y >= 0.0) - return dir.x / dir.y * 0.125 + 0.125; + return 0.125 + v; else - return dir.x / dir.y * 0.125 + (0.50 + 0.125); + return (0.50 + 0.125) + v; } } diff --git a/wadsrc/static/shaders/glsl/shadowmap.fp b/wadsrc/static/shaders/glsl/shadowmap.fp index fb2257b92..5e5438075 100644 --- a/wadsrc/static/shaders/glsl/shadowmap.fp +++ b/wadsrc/static/shaders/glsl/shadowmap.fp @@ -140,12 +140,13 @@ void main() if (radius > 0.0) { vec2 pixelpos; - switch (int(gl_FragCoord.x) / int(ShadowmapQuality/4.0)) + float u = gl_FragCoord.x / ShadowmapQuality * 4.0; + switch (int(u)) { - case 0: pixelpos = vec2((gl_FragCoord.x - float(ShadowmapQuality/8.0)) / float(ShadowmapQuality/8.0), 1.0); break; - case 1: pixelpos = vec2(1.0, (gl_FragCoord.x - float(ShadowmapQuality/4.0 + ShadowmapQuality/8.0)) / float(ShadowmapQuality/8.0)); break; - case 2: pixelpos = vec2(-(gl_FragCoord.x - float(ShadowmapQuality/2.0 + ShadowmapQuality/8.0)) / float(ShadowmapQuality/8.0), -1.0); break; - case 3: pixelpos = vec2(-1.0, -(gl_FragCoord.x - float(ShadowmapQuality*3.0/4.0 + ShadowmapQuality/8.0)) / float(ShadowmapQuality/8.0)); break; + case 0: pixelpos = vec2(u * 2.0 - 1.0, 1.0); break; + case 1: pixelpos = vec2(1.0, 1.0 - (u - 1.0) * 2.0); break; + case 2: pixelpos = vec2(1.0 - (u - 2.0) * 2.0, -1.0); break; + case 3: pixelpos = vec2(-1.0, (u - 3.0) * 2.0 - 1.0); break; } pixelpos = lightpos + pixelpos * radius;