Correct projected wall shadows when there is an offset camera
This commit is contained in:
@@ -16,13 +16,13 @@ void main()
|
||||
|
||||
cenPosT = vec2 ( (cenPos.x + 1) * 0.5 * winSize.x , (cenPos.y + 1) * 0.5 * winSize.y);
|
||||
|
||||
gl_Position = vec4 (cenPos.x + gRad/winSize.x, cenPos.y + gRad/winSize.y, 0.9 , 1);
|
||||
gl_Position = vec4 (cenPos.x + gRad/winSize.x, cenPos.y + gRad/winSize.y, -0.9 , 1);
|
||||
EmitVertex();
|
||||
gl_Position = vec4 (cenPos.x - gRad/winSize.x, cenPos.y + gRad/winSize.y, 0.9 , 1);
|
||||
gl_Position = vec4 (cenPos.x - gRad/winSize.x, cenPos.y + gRad/winSize.y, -0.9 , 1);
|
||||
EmitVertex();
|
||||
gl_Position = vec4 (cenPos.x + gRad/winSize.x, cenPos.y - gRad/winSize.y, 0.9 , 1);
|
||||
gl_Position = vec4 (cenPos.x + gRad/winSize.x, cenPos.y - gRad/winSize.y, -0.9 , 1);
|
||||
EmitVertex();
|
||||
gl_Position = vec4 (cenPos.x - gRad/winSize.x, cenPos.y - gRad/winSize.y, 0.9 , 1);
|
||||
gl_Position = vec4 (cenPos.x - gRad/winSize.x, cenPos.y - gRad/winSize.y, -0.9 , 1);
|
||||
EmitVertex();
|
||||
|
||||
EndPrimitive();
|
||||
|
||||
+20
-17
@@ -3,10 +3,13 @@ layout (points) in;
|
||||
layout (triangle_strip, max_vertices = 12) out;
|
||||
|
||||
uniform vec2 lightPos;
|
||||
uniform mat4 perpMat;
|
||||
uniform mat4 worldMat;
|
||||
|
||||
vec2 lightPosa = lightPos;
|
||||
|
||||
vec4 shift (vec4 p)
|
||||
{ return vec4 (p.xy + (200 * (p.xy-lightPos)), 0 , 1);
|
||||
{ return vec4 (p.xy + (200 * (p.xy-lightPosa)), 0 , 1);
|
||||
}
|
||||
float isLHS (vec2 startV, vec2 testV)
|
||||
{
|
||||
@@ -16,7 +19,7 @@ void emitLine (vec2 pa)
|
||||
{
|
||||
gl_Position = vec4 (pa, 0, 1);
|
||||
EmitVertex();
|
||||
gl_Position = shift (vec4 (pa,0,1)); //vec4 (pa + (200 * (pa - lightPos)), 0 , 1);
|
||||
gl_Position = shift (vec4 (pa,0,1)); //vec4 (pa + (200 * (pa - lightPosa)), 0 , 1);
|
||||
EmitVertex();
|
||||
}
|
||||
|
||||
@@ -30,9 +33,9 @@ mat4 perspective =
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 p1 = worldMat * vec4 (gl_in[0].gl_Position.xy,0,1);
|
||||
vec4 p2 = worldMat * vec4 (gl_in[0].gl_Position.zw,0,1);
|
||||
if (isLHS (p1.xy - lightPos, p2.xy - lightPos) < 0)
|
||||
vec4 p1 = vec4 (gl_in[0].gl_Position.xy,0,1);
|
||||
vec4 p2 = vec4 (gl_in[0].gl_Position.zw,0,1);
|
||||
if (isLHS (p1.xy - lightPosa, p2.xy - lightPosa) < 0)
|
||||
{
|
||||
vec4 p3 = vec4 (p1.xy,-0.5,1);
|
||||
vec4 p4 = vec4 (p2.xy,-0.5,1);
|
||||
@@ -40,18 +43,18 @@ vec4 p5 = shift(p1);
|
||||
vec4 p6 = shift(p2);
|
||||
vec4 p7 = vec4 (p6.xy,-0.5,1);
|
||||
vec4 p8 = vec4 (p5.xy,-0.5,1);
|
||||
gl_Position = perspective * p4; EmitVertex();
|
||||
gl_Position = perspective * p3; EmitVertex();
|
||||
gl_Position = perspective * p7; EmitVertex();
|
||||
gl_Position = perspective * p8; EmitVertex();
|
||||
gl_Position = perspective * p5; EmitVertex();
|
||||
gl_Position = perspective * p3; EmitVertex();
|
||||
gl_Position = perspective * p1; EmitVertex();
|
||||
gl_Position = perspective * p4; EmitVertex();
|
||||
gl_Position = perspective * p2; EmitVertex();
|
||||
gl_Position = perspective * p7; EmitVertex();
|
||||
gl_Position = perspective * p6; EmitVertex();
|
||||
gl_Position = perspective * p5; EmitVertex();
|
||||
gl_Position = perpMat * p4; EmitVertex();
|
||||
gl_Position = perpMat * p3; EmitVertex();
|
||||
gl_Position = perpMat * p7; EmitVertex();
|
||||
gl_Position = perpMat * p8; EmitVertex();
|
||||
gl_Position = perpMat * p5; EmitVertex();
|
||||
gl_Position = perpMat * p3; EmitVertex();
|
||||
gl_Position = perpMat * p1; EmitVertex();
|
||||
gl_Position = perpMat * p4; EmitVertex();
|
||||
gl_Position = perpMat * p2; EmitVertex();
|
||||
gl_Position = perpMat * p7; EmitVertex();
|
||||
gl_Position = perpMat * p6; EmitVertex();
|
||||
gl_Position = perpMat * p5; EmitVertex();
|
||||
EndPrimitive();
|
||||
} else {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user