struct Uniforms { u_scale : vec2; u_offset : vec2; }; [[binding(0), group(0)]] var uniforms : Uniforms; struct VertexOutputs { [[location(0)]] texcoords : vec2; [[builtin(position)]] position : vec4; }; [[stage(vertex)]] fn vs_main([[builtin(vertex_index)]] VertexIndex : u32) -> VertexOutputs { var texcoord = array, 3>(vec2(-0.5, 0.0), vec2(1.5, 0.0), vec2(0.5, 2.0)); var output : VertexOutputs; output.position = vec4(((texcoord[VertexIndex] * 2.0) - vec2(1.0, 1.0)), 0.0, 1.0); var flipY = (uniforms.u_scale.y < 0.0); if (flipY) { output.texcoords = ((((texcoord[VertexIndex] * uniforms.u_scale) + uniforms.u_offset) * vec2(1.0, -1.0)) + vec2(0.0, 1.0)); } else { output.texcoords = ((((texcoord[VertexIndex] * vec2(1.0, -1.0)) + vec2(0.0, 1.0)) * uniforms.u_scale) + uniforms.u_offset); } return output; } [[binding(1), group(0)]] var mySampler : sampler; [[binding(2), group(0)]] var myTexture : texture_2d; [[stage(fragment)]] fn fs_main([[location(0)]] texcoord : vec2) -> [[location(0)]] vec4 { var clampedTexcoord = clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); if (!(all((clampedTexcoord == texcoord)))) { discard; } var srcColor = textureSample(myTexture, mySampler, texcoord); return srcColor; }