diff --git a/shader/wallLight.frag b/shader/wallLight.frag new file mode 100644 index 000000000..6721a2496 --- /dev/null +++ b/shader/wallLight.frag @@ -0,0 +1,10 @@ +#version 430 core +in vec2 vDistField; +in float vLum; +out vec4 fColor; + +void main() +{ + float l = dot(vDistField,vDistField); + fColor = vec4 (pow(1 - l,2),0,0,1); +} diff --git a/shader/wallLight.geom b/shader/wallLight.geom new file mode 100644 index 000000000..51474aea1 --- /dev/null +++ b/shader/wallLight.geom @@ -0,0 +1,55 @@ +#version 430 core +layout (lines) in; +layout (triangle_strip, max_vertices = 14) out; + +in vec4 vBackPoss[]; +uniform vec2 lightPos; +uniform mat4 worldMat; + +void emitLine (vec2 pa) +{ + gl_Position = vec4 (pa, 0, 1); + EmitVertex(); + gl_Position = vec4 (pa + (200 * (pa - lightPos)), 0 , 1); + EmitVertex(); +} + +float isLHS (vec2 startV, vec2 testV) +{ + return sign( -startV.x * testV.y + startV.y * testV.x); +} + +void main() +{ + vec4 frontL4 = worldMat * vec4(gl_in[0].gl_Position.xy, 0 ,1); + vec4 frontR4 = worldMat * vec4(gl_in[0].gl_Position.zw, 0 ,1); + vec2 frontL = frontL4.xy; + vec2 frontR = frontR4.xy; + vec4 backR4 = worldMat * vec4(vBackPoss[0].xy, 0 ,1); + vec4 backL4 = worldMat * vec4(vBackPoss[0].zw, 0 ,1); + vec2 backL = backL4.xy; + vec2 backR = backR4.xy; + +// if (isLHS( lightPos - frontL, frontR - frontL) < 0) +// // if (isLHS( lightPos - backL, backR - backL) < 0) +// { +// // emitLine (frontL); +// // emitLine (backL); +// // emitLine (frontL); +// // emitLine (frontR); +// // emitLine (backR); +// // emitLine (frontR); +// +// emitLine (backR); +// emitLine (backL); +// } +// else +// { +// emitLine (backR); +// emitLine (backL); +// } + + emitLine (frontR); + emitLine (frontL); + EndPrimitive(); +} diff --git a/shader/wallLight.vert b/shader/wallLight.vert new file mode 100644 index 000000000..c708455f3 --- /dev/null +++ b/shader/wallLight.vert @@ -0,0 +1,24 @@ +#version 430 core +layout (location = 0) in vec3 pos; + +out vec2 vDistField; +out float vLum; + +uniform mat4 worldMat; +uniform vec4 lightPosRadLum; + +mat4 perspective = + mat4 (1,0,0,0 + ,0,1,0,0 + ,0,0,1,1 + ,0,0,0,1 + ) ; +void main() +{ + float r = lightPosRadLum.z ; + float x = lightPosRadLum.x ; + float y = lightPosRadLum.y ; + gl_Position = perspective * worldMat * vec4(pos, 1); + vDistField = vec2 ( (pos.x - x)/r , (pos.y - y)/(r*100) ) ; + vLum = lightPosRadLum.w; +}