1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
#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;
}
}
|