Skip to main content

SDF_COMPUTE_WGSL

Constant SDF_COMPUTE_WGSL 

Source
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.