#version 450 #extension GL_EXT_buffer_reference : require struct Rect { vec3 pos; vec2 size; vec4 color; }; layout(std430, buffer_reference) readonly buffer RectList { Rect r[]; }; layout(std430, buffer_reference) readonly buffer ScreenInfo { mat4 bounds; }; layout(std430, push_constant) uniform PushConstant { ScreenInfo screen; RectList rects; } pc; layout(location = 0) out vec4 fragColor; const vec2 square[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0), vec2(0.0, 1.0), }; void main() { Rect rect = pc.rects.r[gl_InstanceIndex]; gl_Position = pc.screen.bounds * vec4(vec3(square[gl_VertexIndex] * rect.size, 0.0) + rect.pos.xyz, 1.0); fragColor = rect.color; }