// Circle mask compute shader // Generates a circular mask (1.0 inside, 0.0 outside) struct CommonUniforms { resolution: vec2, aspect_ratio: f32, time: f32, beat: f32, audio_intensity: f32, }; struct EffectParams { radius: f32, _pad: vec3, }; @group(0) @binding(0) var common: CommonUniforms; @group(0) @binding(1) var params: EffectParams; struct VSOutput { @builtin(position) position: vec4, }; @vertex fn vs_main(@builtin(vertex_index) i: u32) -> VSOutput { var pos = array, 3>( vec2(-1, -1), vec2(3, -1), vec2(-1, 3)); return VSOutput(vec4(pos[i], 0.0, 1.0)); } @fragment fn fs_main(@builtin(position) p: vec4) -> @location(0) vec4 { let uv = p.xy / common.resolution; let center = vec2(0.5, 0.5); let aspect_corrected_uv = (uv - center) * vec2(common.aspect_ratio, 1.0); let dist = length(aspect_corrected_uv); let edge_width = 0.01; let mask = smoothstep(params.radius + edge_width, params.radius - edge_width, dist); return vec4(mask, mask, mask, 1.0); }