voxel-simulation/client/assets/shaders/chunk_visibility.wgsl
2025-06-13 12:45:29 +02:00

30 lines
1015 B
WebGPU Shading Language

// Computes visible chunk keys based on camera centre and view radius.
// Input arrays must match in length and are processed per invocation.
struct Params {
centre: vec3<i32>;
radius: i32;
count: u32;
};
@group(0) @binding(0) var<storage, read> occupied: array<vec3<i32>>;
@group(0) @binding(1) var<storage, read> spawned: array<u32>;
@group(0) @binding(2) var<storage, read_write> out_keys: array<vec3<i32>>;
@group(0) @binding(3) var<storage, read_write> out_count: atomic<u32>;
@group(0) @binding(4) var<uniform> params: Params;
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
let idx = id.x;
if idx >= params.count { return; }
let key = occupied[idx];
if spawned[idx] != 0u { return; }
let dx = key.x - params.centre.x;
let dy = key.y - params.centre.y;
let dz = key.z - params.centre.z;
if dx*dx + dy*dy + dz*dz <= params.radius * params.radius {
let i = atomicAdd(&out_count, 1u);
out_keys[i] = key;
}
}