#version 450 core struct DataS { vec2 pos; vec2 v1; vec2 v2; vec2 rad; }; layout (std430, binding = 9) readonly buffer Data { DataS data[]; }; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; out vec2 texPos; out vec2 distmask; out vec2 pinch; 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)); vec2 r1 = (theMat * vec4(data[gl_VertexID/6].v1, 0,1)).xy - (theMat * vec4(0,0,0,1)).xy; vec2 r2 = (theMat * vec4(data[gl_VertexID/6].v2, 0,1)).xy - (theMat * vec4(0,0, 0,1)).xy; pinch = (theMat * vec4(data[gl_VertexID/6].rad, 0,1)).xy - (theMat * vec4(0,0, 0,1)).xy; // mat2 distT = mat2(-1/r1.x, -1/r2.x // ,1/r1.y, -1/r2.y // ); // mat2 distT = mat2(2, 0 // ,-1/sqrt(2), 1/sqrt(2) // ); // mat2 distT = mat2(1/r1.x, 2*sqrt(2) // ,1/r1.y, 2*sqrt(2) // ); mat2 distT = inverse (mat2(r1,r2)); // mat2 distT = mat2(1/r1.x, 1/r2.x // ,1/r1.y, 1/r2.y // ); //distmask = (cs[k] - off.xy)/r; distmask = distT * (cs[k] - off.xy); texPos = 0.5 * (cs[k]+vec2(1,1)); gl_Position = vec4 (cs[k],0,1); }