Krolyxon
Commit 1d9227a

Branches

Tags

Refs →

remagesrcrendershadersimage.wgsl

61 lines · 2.1 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 // x: gamma, y: brightness, z: contrast, w: 1 when any is not neutral
13 adjust: vec4<f32>,
14};
15
16@group(0) @binding(0) var<uniform> u: Uniforms;
17@group(0) @binding(1) var tex: texture_2d<f32>;
18@group(1) @binding(0) var samp: sampler;
19
20struct VOut {
21 @builtin(position) pos: vec4<f32>,
22 @location(0) uv: vec2<f32>,
23};
24
25@vertex
26fn vs(@builtin(vertex_index) i: u32) -> VOut {
27 var corners = array<vec2<f32>, 6>(
28 vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0),
29 vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0),
30 );
31 let uv = corners[i];
32 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);
33 var out: VOut;
34 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);
35 out.uv = uv;
36 return out;
37}
38
39@fragment
40fn fs(in: VOut) -> @location(0) vec4<f32> {
41 var c = textureSample(tex, samp, in.uv);
42 if u.adjust.w > 0.5 {
43 // Adjust in display (sRGB-ish) space, as viewers do, then back to linear.
44 var v = pow(max(c.rgb, vec3(0.0)), vec3(1.0 / 2.2));
45 v = (v - 0.5) * u.adjust.z + 0.5 + u.adjust.y;
46 v = pow(clamp(v, vec3(0.0), vec3(1.0)), vec3(1.0 / u.adjust.x));
47 c = vec4(pow(v, vec3(2.2)), c.a);
48 }
49 var bg = u.bg.rgb;
50 let mode = u32(u.params.y);
51 let cell = u.params.z;
52 if mode == 1u {
53 let d = length(in.pos.xy - (floor(in.pos.xy / cell) + 0.5) * cell);
54 let k = 1.0 - smoothstep(u.params.w - 0.5, u.params.w + 0.5, d);
55 bg = mix(bg, u.dot_color.rgb, k);
56 } else if mode == 2u {
57 let q = vec2<u32>(floor(in.pos.xy / cell));
58 bg = mix(bg, u.dot_color.rgb, f32((q.x + q.y) & 1u));
59 }
60 return vec4(mix(bg, c.rgb, c.a), u.params.x);
61}