aboutsummaryrefslogtreecommitdiff
path: root/flowy/src/shader.wgsl
blob: bfa417640cdf1293576e5ffd7d38791ef80e19ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@group(0) @binding(0) var output: texture_storage_2d<bgra8unorm, write>;
@group(0) @binding(1) var texa: texture_2d<f32>;
@group(0) @binding(2) var texb: texture_2d<f32>;

const SDIST: i32 = 4;

const NN: vec2<i32> = vec2(-1,-1);
const NP: vec2<i32> = vec2(-1,1);
const PN: vec2<i32> = vec2(1,-1);
const PP: vec2<i32> = vec2(1,1);

@compute @workgroup_size(1) fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
    let uv = vec2<i32>(global_id.xy);
    let orig = textureLoad(texa, uv, 0);
    let orignn = textureLoad(texa, uv+NN, 0);
    let orignp = textureLoad(texa, uv+NP, 0);
    let origpn = textureLoad(texa, uv+PN, 0);
    let origpp = textureLoad(texa, uv+PP, 0);

    var best_sim = 1000.;
    var best_coord = vec2(0,0);
    for (var x = -SDIST; x <= SDIST; x++) {
    for (var y = -SDIST; y <= SDIST; y++) {
        let ov = uv + vec2(x,y);
        let samp = textureLoad(texb, ov, 0);
        let sampnn = textureLoad(texb, ov+NN, 0);
        let sampnp = textureLoad(texb, ov+NP, 0);
        let samppn = textureLoad(texb, ov+PN, 0);
        let samppp = textureLoad(texb, ov+PP, 0);
        let d = distance(samp.rgb, orig.rgb)
            + distance(sampnn.rgb, orignn.rgb)
            + distance(sampnp.rgb, orignp.rgb)
            + distance(samppn.rgb, origpn.rgb)
            + distance(samppp.rgb, origpp.rgb);
        if d < best_sim {
            best_sim = d;
            best_coord = vec2(x,y);
        }
    }}

    let col = vec4(colormap_vec(vec2<f32>(best_coord) / f32(SDIST)), 1.);

    textureStore(output, global_id.xy, col);
}

fn colormap_vec(v: vec2<f32>) -> vec3<f32> {
    return vec3(v.y, v.x - 0.5 * v.y, -v.x - 0.5 * v.y);
}