mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-27 05:30:56 +00:00
Generate shadow map for lights
This commit is contained in:
parent
62c285f7b3
commit
d450deee76
1 changed files with 26 additions and 11 deletions
|
@ -33,18 +33,17 @@ layout(std430, binding = 3) buffer LightSegs
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// Ray/BSP collision test. Returns 0 if the ray hit a line, 1 otherwise.
|
// Ray/BSP collision test. Returns where the ray hit something.
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
float rayTest(vec2 from, vec2 to)
|
vec2 rayTest(vec2 from, vec2 to)
|
||||||
{
|
{
|
||||||
const int max_iterations = 50;
|
const int max_iterations = 50;
|
||||||
const float epsilon = 0.0000001;
|
const float epsilon = 0.0000001;
|
||||||
|
|
||||||
// Avoid wall acne by adding some margin
|
// Avoid wall acne by adding some margin
|
||||||
vec2 margin = normalize(to - from);
|
vec2 margin = normalize(to - from);
|
||||||
to -= margin;
|
|
||||||
|
|
||||||
vec2 raydelta = to - from;
|
vec2 raydelta = to - from;
|
||||||
float raydist2 = dot(raydelta, raydelta);
|
float raydist2 = dot(raydelta, raydelta);
|
||||||
|
@ -52,7 +51,7 @@ float rayTest(vec2 from, vec2 to)
|
||||||
float rayd = dot(raynormal, from);
|
float rayd = dot(raynormal, from);
|
||||||
|
|
||||||
if (raydist2 < 1.0 || bspNodes.length() == 0)
|
if (raydist2 < 1.0 || bspNodes.length() == 0)
|
||||||
return 1.0;
|
return to;
|
||||||
|
|
||||||
int nodeIndex = bspNodes.length() - 1;
|
int nodeIndex = bspNodes.length() - 1;
|
||||||
|
|
||||||
|
@ -85,7 +84,7 @@ float rayTest(vec2 from, vec2 to)
|
||||||
if (dot(raydelta, seghitdelta) > 0.0 && dot(seghitdelta, seghitdelta) < raydist2) // We hit a line segment.
|
if (dot(raydelta, seghitdelta) > 0.0 && dot(seghitdelta, seghitdelta) < raydist2) // We hit a line segment.
|
||||||
{
|
{
|
||||||
if (seg.bSolid.x > 0.0) // segment line is one-sided
|
if (seg.bSolid.x > 0.0) // segment line is one-sided
|
||||||
return 0.0;
|
return from + seghitdelta;
|
||||||
|
|
||||||
// We hit a two-sided segment line. Move to the other side and continue ray tracing.
|
// We hit a two-sided segment line. Move to the other side and continue ray tracing.
|
||||||
from = from + seghitdelta + margin;
|
from = from + seghitdelta + margin;
|
||||||
|
@ -96,7 +95,7 @@ float rayTest(vec2 from, vec2 to)
|
||||||
rayd = dot(raynormal, from);
|
rayd = dot(raynormal, from);
|
||||||
|
|
||||||
if (raydist2 < 1.0 || bspNodes.length() == 0)
|
if (raydist2 < 1.0 || bspNodes.length() == 0)
|
||||||
return 1.0;
|
return to;
|
||||||
|
|
||||||
nodeIndex = bspNodes.length() - 1;
|
nodeIndex = bspNodes.length() - 1;
|
||||||
|
|
||||||
|
@ -108,25 +107,41 @@ float rayTest(vec2 from, vec2 to)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hit_line)
|
if (!hit_line)
|
||||||
return 1.0;
|
return to;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
int lightIndex = int(gl_FragCoord.y);
|
int lightIndex = int(gl_FragCoord.y);
|
||||||
int x = int(gl_FragCoord.x);
|
|
||||||
|
|
||||||
vec4 light = lights[lightIndex];
|
vec4 light = lights[lightIndex];
|
||||||
float radius = light.w;
|
float radius = light.w;
|
||||||
vec2 lightpos = light.xy;
|
vec2 lightpos = light.xy;
|
||||||
vec2 pixelpos = lightpos + vec2(10.0);
|
|
||||||
|
|
||||||
if (radius > 0.0)
|
if (radius > 0.0)
|
||||||
FragColor = vec4(rayTest(lightpos, pixelpos), 0.0, 0.0, 1.0);
|
{
|
||||||
|
vec2 pixelpos;
|
||||||
|
switch (int(gl_FragCoord.x) / 256)
|
||||||
|
{
|
||||||
|
case 0: pixelpos = vec2((gl_FragCoord.x - 128.0) / 128.0, 1.0); break;
|
||||||
|
case 1: pixelpos = vec2(1.0, (gl_FragCoord.x - 384.0) / 128.0); break;
|
||||||
|
case 2: pixelpos = vec2((gl_FragCoord.x - 640.0) / 128.0, -1.0); break;
|
||||||
|
case 3: pixelpos = vec2(-1.0, (gl_FragCoord.x - 896.0) / 128.0); break;
|
||||||
|
}
|
||||||
|
pixelpos = lightpos + pixelpos * radius;
|
||||||
|
|
||||||
|
vec2 hitpos = rayTest(lightpos, pixelpos);
|
||||||
|
vec2 delta = hitpos - lightpos;
|
||||||
|
float dist2 = dot(delta, delta);
|
||||||
|
|
||||||
|
FragColor = vec4(dist2, 0.0, 0.0, 1.0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue