SoftShadowRadius for 1 sample RT lights via dithering effect

This commit is contained in:
RaveYard 2025-04-11 14:46:03 +02:00 committed by Magnus Norddahl
commit ee14cee226

View file

@ -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
}