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