#version 450 core struct PosColNorm { vec4 pos; vec4 dummy; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; layout (std430, binding = 3) readonly buffer Data { PosColNorm data[]; }; layout (std430, binding = 4) readonly buffer Indices { uint indices[]; }; layout(location=0)uniform vec3 lightPos; layout(location=1)uniform vec4 lumRad; vec4 projNear (vec4 pos) { // note we project to a specific height // this is quite brittle, not ideal vec3 dir = pos.xyz - lightPos ; float a = (100 - pos.z) / dir.z ; vec2 xy = (pos.xyz + a * dir).xy ; return vec4 ( xy, 100 , 1) ; } bool ztest (vec4 p) {return p.z - lightPos.z > 0;} void main() { int j = gl_VertexID/3; int i1 = j * 3; vec4 po = data[indices[gl_VertexID]].pos; gl_Position = (po.w == 1 && ztest(data[indices[i1]].pos) && ztest(data[indices[i1+1]].pos) && ztest(data[indices[i1+2]].pos) ? theMat * projNear(po) : vec4(1,1,1,0) ); } //layout (location = 0) in vec4 position; //layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; //uniform vec3 lightPos; //uniform vec4 lumRad; //out float drawbit; //void main() //{ // gl_Position = vec4(position.xyz,1); // drawbit = position.w; //}