#version 450 core struct PosCol { vec4 posx; vec4 colx; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; layout (std430, binding = 13) readonly buffer Data { PosCol data[]; }; layout (location = 0) uniform int n; out vec4 gColC; // center color out vec4 gColE; // edge color out vec2 gBoundingBox; out vec3 gPos; const int ks[6] = // {1,0,2 // 2--3 ,2,0,3 // | | }; // 1--0 // const vec2 bs[4] = { vec2( 1, 1) , vec2(-1, 1) , vec2(-1,-1) , vec2( 1,-1) } ; void main() { int i0 = n + (3 * ((gl_VertexID-n)/6) ); gColC = data[i0].colx; gColE = data[i0+1].colx; int k = ks[(gl_VertexID - n) % 6]; gBoundingBox = bs[k]; gPos = (k > 2.5 ? data[i0].posx + data[i0+2].posx - data[i0+1].posx : data[i0+k].posx ).xyz; gl_Position = theMat * vec4(gPos,1); }