From 3bbe5ebcdb2a5aa6810dd05576c6ec031efdc1c7 Mon Sep 17 00:00:00 2001 From: Tengu712 Date: Wed, 7 Oct 2026 00:57:01 +0900 Subject: render image --- src/shader.wgsl | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'src/shader.wgsl') diff --git a/src/shader.wgsl b/src/shader.wgsl index e0b34f4..80df5b0 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -1,18 +1,25 @@ +enable wgpu_binding_array; + struct Instance { - position: vec2, - scale: vec2, - uv: vec4, + transform: mat2x2, + translation: vec2, + uv_offset: vec2, + uv_size: vec2, + tex_id: u32, + _pad: u32, } struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, + @builtin(position) position: vec4, + @location(0) uv: vec2, + @location(1) @interpolate(flat) tex_id: u32, } @group(0) @binding(0) var instances: array; @group(1) @binding(0) var tex_sampler: sampler; @group(1) @binding(1) var font_tex: texture_2d; +@group(1) @binding(2) var image_texs: binding_array, 5>; @vertex fn vs_main( @@ -23,13 +30,17 @@ fn vs_main( let instance = instances[in_instance_index]; var out: VertexOutput; - out.position = vec4(instance.position + (uv - 0.5) * instance.scale * 2.0, 0.0, 1.0); - out.uv = instance.uv.xy + vec2(uv.x, 1.0 - uv.y) * instance.uv.zw; + out.position = vec4(instance.transform * (uv - 0.5) + instance.translation, 0.0, 1.0); + out.uv = instance.uv_offset + uv * instance.uv_size; + out.tex_id = instance.tex_id; return out; } @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4 { - return vec4(1.0, 1.0, 1.0, textureSample(font_tex, tex_sampler, in.uv).r); + if in.tex_id >= 5u { + return vec4(1.0, 1.0, 1.0, textureSampleLevel(font_tex, tex_sampler, in.uv, 0.0).r); + } + return textureSampleLevel(image_texs[in.tex_id], tex_sampler, in.uv, 0.0); } -- cgit v1.3.1