SoftShadowRadius for 1 sample RT lights via dithering effect
This commit is contained in:
parent
389ad18411
commit
ee14cee226
1 changed files with 30 additions and 16 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue