pub const SDF_COMPUTE_WGSL: &str = r#"
pub(super) struct SdfSphereParams {
nx: u32,
ny: u32,
nz: u32,
dx: f32,
origin_x: f32,
origin_y: f32,
origin_z: f32,
cx: f32,
cy: f32,
cz: f32,
radius: f32,
_pad: u32,
}
@group(0) @binding(0) var<storage, read_write> sdf_values: array<f32>;
@group(0) @binding(1) var<uniform> params: SdfSphereParams;
@compute @workgroup_size(64)
pub(super) fn main(@builtin(global_invocation_id) id: vec3<u32>) {
let total = params.nx * params.ny * params.nz;
let idx = id.x;
if (idx >= total) { return; }
let i = idx / (params.ny * params.nz);
let j = (idx / params.nz) % params.ny;
let k = idx % params.nz;
let px = params.origin_x + (f32(i) + 0.5) * params.dx;
let py = params.origin_y + (f32(j) + 0.5) * params.dx;
let pz = params.origin_z + (f32(k) + 0.5) * params.dx;
let dist = distance(vec3<f32>(px, py, pz),
vec3<f32>(params.cx, params.cy, params.cz));
sdf_values[idx] = dist - params.radius;
}
"#;Expand description
WGSL compute shader that computes a sphere SDF on the GPU.