@group(0) @binding(0) var smplr: sampler; @group(0) @binding(1) var txt: texture_2d; #include "common_uniforms" struct ChromaAberrationParams { offset_scale: f32, angle: f32, }; @group(0) @binding(2) var uniforms: CommonUniforms; @group(0) @binding(3) var params: ChromaAberrationParams; #include "render/fullscreen_vs" @fragment fn fs_main(@builtin(position) p: vec4) -> @location(0) vec4 { let uv = p.xy / uniforms.resolution; let amp = params.offset_scale * uniforms.audio_intensity; let offset = amp * vec2(cos(params.angle), sin(params.angle)); let center = textureSample(txt, smplr, uv); let r = textureSample(txt, smplr, uv + offset).r; let b = textureSample(txt, smplr, uv - offset).b; return vec4(r, center.g, b, 1.0); }