#version 450 struct Vertex { vec3 position; vec2 texcoord; vec4 color; }; // Binding 0: vertices layout(set = 0, binding = 0) buffer Vertices { Vertex vertices[ ]; }; // Binding 1: transform matrices layout(set = 0, binding = 1) buffer Transforms { mat4 transforms[ ]; }; layout(set = 2, binding = 0) uniform UBO { uint vertexCount; } ubo; layout (local_size_x = 256) in; void main() { // Current buffer index uint index = gl_GlobalInvocationID.x; // Don't write past particle count if (index >= ubo.vertexCount) { return; } uint transformIndex = index / 4; mat4 transform = transforms[transformIndex]; vec4 position = vec4(vertices[index].position, 1.0); vertices[index].position = vec3(transform * position); }