// Textured-quad shader for raster images (RasterImage entity). // Renders a four-vertex quad (two triangles) with a sampled texture. // ── Bind group 0: shared projection uniforms ───────────────────────────────── struct Uniforms { mvp: mat4x4, view: mat4x4, width: f32, height: f32, cam_z: f32, _pad: f32, }; @group(0) @binding(0) var u: Uniforms; // ── Bind group 1: per-image texture + sampler ──────────────────────────────── @group(1) @binding(0) var img_texture: texture_2d; @group(1) @binding(1) var img_sampler: sampler; // Per-image params (fade, clip flag, etc.) struct ImageParams { opacity: f32, _pad0: f32, _pad1: f32, _pad2: f32, }; @group(1) @binding(2) var img_params: ImageParams; // ── Vertex stage ────────────────────────────────────────────────────────────── struct VertIn { @location(0) pos: vec3, @location(1) uv: vec2, }; struct VertOut { @builtin(position) clip_pos: vec4, @location(0) uv: vec2, }; @vertex fn vs_main(in: VertIn) -> VertOut { var out: VertOut; out.clip_pos = u.mvp * vec4(in.pos, 1.0); out.uv = in.uv; return out; } // ── Fragment stage ──────────────────────────────────────────────────────────── @fragment fn fs_main(in: VertOut) -> @location(0) vec4 { let col = textureSample(img_texture, img_sampler, in.uv); return vec4(col.rgb, col.a * img_params.opacity); }