Files
QuaternionEngine/shaders/particles_build_indices.comp
2025-12-18 17:32:30 +09:00

47 lines
1021 B
Plaintext

#version 450
// Output is a global indices[] buffer, indexed by gl_InstanceIndex.
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
layout(std430, set = 0, binding = 0) readonly buffer SortedBlocks
{
uint blocks[];
} sortedBlocks;
layout(std430, set = 0, binding = 1) writeonly buffer DrawIndices
{
uint indices[];
} outIndices;
layout(push_constant) uniform Push
{
uvec4 header; // x=base, y=count, z=flags (bit0=identity)
} pc;
const uint BLOCK_SIZE = 256u;
void main()
{
uint i = gl_GlobalInvocationID.x;
uint count = pc.header.y;
if (i >= count) return;
uint base = pc.header.x;
uint flags = pc.header.z;
uint outIdx = base + i;
uint particleIdx = base + i;
if ((flags & 1u) == 0u)
{
uint blockRank = i / BLOCK_SIZE;
uint within = i - blockRank * BLOCK_SIZE;
uint block = sortedBlocks.blocks[blockRank];
particleIdx = base + block * BLOCK_SIZE + within;
}
outIndices.indices[outIdx] = particleIdx;
}