// Gaussian blur shader for Sequence v2 #include "sequence_uniforms" @group(0) @binding(0) var input_sampler: sampler; @group(0) @binding(1) var input_texture: texture_2d; @group(0) @binding(2) var uniforms: UniformsSequenceParams; struct GaussianBlurParams { direction: vec2, radius: f32, _pad: f32, }; @group(0) @binding(3) var params: GaussianBlurParams; struct VertexOutput { @builtin(position) position: vec4, @location(0) uv: vec2, }; @vertex fn vs_main(@builtin(vertex_index) vid: u32) -> VertexOutput { var out: VertexOutput; let x = f32((vid & 1u) << 1u); let y = f32((vid & 2u)); out.position = vec4(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0); out.uv = vec2(x, y); return out; } @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { let texel_size = 1.0 / uniforms.resolution; let offset = params.direction * texel_size; var color = vec4(0.0); let kernel_size = i32(params.radius); var weight_sum = 0.0; for (var i = -kernel_size; i <= kernel_size; i++) { let sample_offset = f32(i) * offset; let weight = exp(-f32(i * i) / (2.0 * params.radius * params.radius)); color += textureSample(input_texture, input_sampler, in.uv + sample_offset) * weight; weight_sum += weight; } return color / weight_sum; }