Crafter.Graphics/examples/RTVolume/aabbs.comp.glsl

43 lines
1.5 KiB
Text
Raw Normal View History

2026-07-22 18:09:06 +02:00
//SPDX-License-Identifier: MIT
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
#version 460
#extension GL_EXT_buffer_reference : enable
#extension GL_EXT_scalar_block_layout : enable
// Issue #37: GPU-resident procedural AABBs. This compute shader is the
// "producer" — it writes the per-box bounding boxes straight into a device
// buffer that Mesh::BuildProcedural / RefitProcedural then consume by device
// address, with no host copy. Here it emits a single unit box [-1,1]^3 (the
// bounding volume the intersection shader turns into a sphere); `time` lets
// the box breathe so a per-frame refit has something to track. A real
// particle system would write one box per particle from simulation state.
//
// The buffer is reached via a buffer_reference (its device address pushed in
// `pc`), so this dispatch needs no descriptor-heap binding for the output.
layout(buffer_reference, scalar) buffer AabbRef {
float data[]; // 6 floats per box: min.xyz, max.xyz (RTAabb layout)
};
layout(push_constant) uniform PC {
AabbRef boxes;
uint count;
float time;
} pc;
layout(local_size_x = 64) in;
void main() {
uint i = gl_GlobalInvocationID.x;
if (i >= pc.count) return;
float r = 1.0 + 0.15 * sin(pc.time); // gently pulsing radius
uint b = i * 6u;
pc.boxes.data[b + 0u] = -r;
pc.boxes.data[b + 1u] = -r;
pc.boxes.data[b + 2u] = -r;
pc.boxes.data[b + 3u] = r;
pc.boxes.data[b + 4u] = r;
pc.boxes.data[b + 5u] = r;
}