From ee14cee226029e424e99120b9099dd1f938c2a3a Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Fri, 11 Apr 2025 14:46:03 +0200 Subject: [PATCH] SoftShadowRadius for 1 sample RT lights via dithering effect --- wadsrc/static/shaders/scene/light_trace.glsl | 46 +++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/wadsrc/static/shaders/scene/light_trace.glsl b/wadsrc/static/shaders/scene/light_trace.glsl index bac9e2482..630879038 100644 --- a/wadsrc/static/shaders/scene/light_trace.glsl +++ b/wadsrc/static/shaders/scene/light_trace.glsl @@ -153,7 +153,7 @@ float traceShadow(vec3 lightpos, float softShadowRadius) #if defined(SHADE_VERTEX) return traceHit(origin, direction, dist); #else - if(SHADOWMAP_FILTER == 0 || softShadowRadius == 0) + if(softShadowRadius == 0) { return traceHit(origin, direction, dist); } @@ -163,28 +163,42 @@ float traceShadow(vec3 lightpos, float softShadowRadius) vec3 xdir = normalize(cross(direction, v)); vec3 ydir = cross(direction, xdir); - float sum = 0.0; - const int step_count = SHADOWMAP_FILTER * 4; - - if(USE_RAYTRACE_PRECISE) + if (SHADOWMAP_FILTER > 0) { - for (int i = 0; i < step_count; i++) + float sum = 0.0; + const int step_count = SHADOWMAP_FILTER * 4; + + if (USE_RAYTRACE_PRECISE) { - vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; - vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; - sum += TraceDynLightRay(origin, 0.01f, normalize(pos - origin), dist); + for (int i = 0; i < step_count; i++) + { + vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; + vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; + sum += TraceDynLightRay(origin, 0.01f, normalize(pos - origin), dist); + } } + else + { + for (int i = 0; i < step_count; i++) + { + vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; + vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; + sum += TraceAnyHit(origin, 0.01f, normalize(pos - origin), dist) ? 0.0 : 1.0; + } + } + + return (sum / step_count); } else { - for (int i = 0; i < step_count; i++) - { - vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; - vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; - sum += TraceAnyHit(origin, 0.01f, normalize(pos - origin), dist) ? 0.0 : 1.0; - } + const int samples_per_dimension = 4; + const int sample_count = samples_per_dimension * samples_per_dimension; + const int index = (int(int(gl_FragCoord.x) % samples_per_dimension + gl_FragCoord.y * samples_per_dimension)) % sample_count; + + vec2 gridoffset = getVogelDiskSample(index, sample_count, 0) * softShadowRadius; + vec3 pos = target + xdir * gridoffset.x + ydir * gridoffset.y; + return traceHit(origin, normalize(pos - origin), dist); } - return (sum / step_count); } #endif }