#version 450 core struct DataS { vec2 pos; vec2 rad1; vec2 rad2; }; layout (std430, binding = 9) readonly buffer Data { DataS data[]; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; out vec2 texPos; out vec2 distmask; const int ks[6] = {0,1,2 // 2--3 ,2,1,3 // | | }; // 0--1 const vec2 cs[4] = { vec2 (-1,-1) , vec2 ( 1,-1) , vec2 (-1, 1) , vec2 ( 1, 1) }; void main() { int k = ks[gl_VertexID]; vec4 off = (theMat * vec4(data[gl_VertexID/6].pos, 0,1)); float r = distance ((theMat * vec4(data[gl_VertexID/6].rad1, 0,1)).xy ,(theMat * vec4(0,0, 0,1)).xy); distmask = (cs[k] - off.xy)/r; texPos = 0.5 * (cs[k]+vec2(1,1)); gl_Position = vec4 (cs[k],0,1); }