ADD: HQ particles
This commit is contained in:
46
shaders/particles_build_indices.comp
Normal file
46
shaders/particles_build_indices.comp
Normal file
@@ -0,0 +1,46 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user