struct Material { color_a: vec4, color_b: vec4, border_color: vec4, time: f32, speed: f32, border_size: f32, }; @group(2) @binding(0) var mat: Material; @fragment fn fragment(in: VertexOutput) -> @location(0) vec4 { let uv = in.uv; // animate let x = uv.x + params.time * params.speed; let g = fract(x); let fill = mix(params.color_a, params.color_b, g); // borders let top = step(uv.y, params.border_size); let bottom = step(1.0 - params.border_size, uv.y); let border_mask = max(top, bottom); return mix(fill, params.border_color, border_mask); }