#version 450 layout(location=0) out vec2 v_coords; layout(location=1) out float v_angle; layout(location=2) out vec4 v_color; layout(set = 0, binding = 0) uniform Globals { vec2 u_resolution; vec2 u_scroll_offset; float u_zoom; }; struct Instances { vec2 center; float radius; float angle; int z_index; uint color; }; layout(std430, set=1, binding=0) buffer InstancesBlock { Instances instances[]; }; void main() { float min_x = -1.; float max_x = 1.; float min_y = -1; float max_y = 1.; vec2 position[4] = vec2[4]( vec2(min_x, min_y), vec2(min_x, max_y), vec2(max_x, min_y), vec2(max_x, max_y) ); v_angle = instances[gl_InstanceIndex].angle; uint color = instances[gl_InstanceIndex].color; v_color = vec4( float((color >> 16) & 0xFF) / 255., float((color >> 8) & 0xFF) / 255., float(color & 0xFF) / 255., float((color >> 24) & 0xFF) / 255.); v_coords = position[gl_VertexIndex] * vec2(1, -1); float radius = instances[gl_InstanceIndex].radius; vec2 local_pos = instances[gl_InstanceIndex].center + position[gl_VertexIndex] * radius; vec2 world_pos = local_pos - u_scroll_offset; vec2 zoom_factor = u_zoom / (vec2(0.5, 0.5) * u_resolution); vec2 transformed_pos = world_pos * zoom_factor * vec2(1., -1); float z_index = float(instances[gl_InstanceIndex].z_index) + 0.5; float z = z_index >= 0 ? z_index / 10000. : 1e-7; gl_Position = vec4(transformed_pos, z, 1.0); }