#version 440 layout (local_size_x = 256) in; struct Data { vec2 pos; float dir; }; layout(std140, binding = 0) buffer StorageBuffer { Data d[]; } buf; layout(std140, binding = 1) uniform UniformBuffer { float step; uint count; } ubuf; void main() { uint index = gl_GlobalInvocationID.x; if (index < ubuf.count) { vec2 p = buf.d[index].pos; float dir = buf.d[index].dir; p.x += dir * ubuf.step * 0.01; if (p.x > 1.0) { p.x = 1.0; buf.d[index].dir *= -1.0; } if (p.x < -1.0) { p.x = -1.0; buf.d[index].dir *= -1.0; } buf.d[index].pos = p; } }