// GPU procedural Perlin noise texture generator. // Fractional Brownian Motion using value noise. #include "math/noise" struct PerlinParams { width: u32, height: u32, seed: f32, frequency: f32, amplitude: f32, amplitude_decay: f32, octaves: u32, _pad0: f32, // Padding for alignment } @group(0) @binding(0) var output_tex: texture_storage_2d; @group(0) @binding(1) var params: PerlinParams; @compute @workgroup_size(8, 8, 1) fn main(@builtin(global_invocation_id) id: vec3) { if (id.x >= params.width || id.y >= params.height) { return; } let uv = vec2(f32(id.x) / f32(params.width), f32(id.y) / f32(params.height)); var value = 0.0; var amplitude = params.amplitude; var frequency = params.frequency; var total_amp = 0.0; for (var o: u32 = 0u; o < params.octaves; o++) { let p = uv * frequency + params.seed; value += noise_2d(p) * amplitude; total_amp += amplitude; frequency *= 2.0; amplitude *= params.amplitude_decay; } value /= total_amp; let clamped = clamp(value, 0.0, 1.0); textureStore(output_tex, id.xy, vec4(clamped, clamped, clamped, 1.0)); }