Krolyxon
Commit c498905

Branches

Tags

Refs →

remagesrcrendershadersimage.wgsl

52 lines · 1.7 KB · WGSL

1// One image quad: affine placement, alpha background (solid / dots / checker), crossfade alpha.
2
3struct Uniforms {
4 // screen = mat2(m.xy, m.zw) * uv + t, in physical pixels
5 m: vec4<f32>,
6 t: vec2<f32>,
7 viewport: vec2<f32>,
8 bg: vec4<f32>,
9 dot_color: vec4<f32>,
10 // x: opacity, y: alpha-bg mode (0 solid, 1 dots, 2 checker), z: cell px, w: dot radius px
11 params: vec4<f32>,
12};
13
14@group(0) @binding(0) var<uniform> u: Uniforms;
15@group(0) @binding(1) var tex: texture_2d<f32>;
16@group(1) @binding(0) var samp: sampler;
17
18struct VOut {
19 @builtin(position) pos: vec4<f32>,
20 @location(0) uv: vec2<f32>,
21};
22
23@vertex
24fn vs(@builtin(vertex_index) i: u32) -> VOut {
25 var corners = array<vec2<f32>, 6>(
26 vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0),
27 vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0),
28 );
29 let uv = corners[i];
30 let p = vec2(u.m.x * uv.x + u.m.y * uv.y + u.t.x, u.m.z * uv.x + u.m.w * uv.y + u.t.y);
31 var out: VOut;
32 out.pos = vec4(p.x / u.viewport.x * 2.0 - 1.0, 1.0 - p.y / u.viewport.y * 2.0, 0.0, 1.0);
33 out.uv = uv;
34 return out;
35}
36
37@fragment
38fn fs(in: VOut) -> @location(0) vec4<f32> {
39 let c = textureSample(tex, samp, in.uv);
40 var bg = u.bg.rgb;
41 let mode = u32(u.params.y);
42 let cell = u.params.z;
43 if mode == 1u {
44 let d = length(in.pos.xy - (floor(in.pos.xy / cell) + 0.5) * cell);
45 let k = 1.0 - smoothstep(u.params.w - 0.5, u.params.w + 0.5, d);
46 bg = mix(bg, u.dot_color.rgb, k);
47 } else if mode == 2u {
48 let q = vec2<u32>(floor(in.pos.xy / cell));
49 bg = mix(bg, u.dot_color.rgb, f32((q.x + q.y) & 1u));
50 }
51 return vec4(mix(bg, c.rgb, c.a), u.params.x);
52}