43 lines
1.4 KiB
WebGPU Shading Language
43 lines
1.4 KiB
WebGPU Shading Language
|
[[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;
|
||
|
}
|