aboutsummaryrefslogtreecommitdiffstats
path: root/shaders/default.wgsl
blob: b721c82a89fe55034e0d3d31c30c209419f32059 (plain) (blame)
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
51
// shaders/default.wgsl
struct Uniforms {
    i_resolution: vec3<f32>,
    i_time: f32,
    i_mouse: vec4<f32>,
};

@group(0) @binding(0) var<uniform> uniforms: Uniforms;

fn palette(t: f32) -> vec3<f32> {
    let a = vec3<f32>(0.5, 0.5, 0.5);
    let b = vec3<f32>(0.5, 0.5, 0.5);
    let c = vec3<f32>(1.0, 1.0, 1.0);
    let d = vec3<f32>(0.263, 0.416, 0.557);
    return a + b * cos(6.28318 * (c * t + d));
}

@vertex
fn vs_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4<f32> {
    // Full-screen triangle
    let pos = vec2<f32>(
        f32(vertex_index == 0u) * 4.0 - 1.0,
        f32(vertex_index == 1u) * 4.0 - 1.0
    );
    return vec4<f32>(pos, 0.0, 1.0);
}

@fragment
fn fs_main(@builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> {
    var uv = (frag_coord.xy * 2.0 - uniforms.i_resolution.xy) / uniforms.i_resolution.y;
    let uv0 = uv;
    let m = (uniforms.i_mouse.xy * 2.0 - uniforms.i_resolution.xy) / uniforms.i_resolution.y;
    var final_color = vec3<f32>(0.0);

    for (var i: f32 = 0.0; i < 4.0; i = i + 1.0) {
        uv = fract(uv * m.x) - 0.5;

        var d = length(uv) * exp(-length(uv0));

        let col = palette(length(uv0) + i * 0.4 + uniforms.i_time * 0.4);

        d = sin(d * 8.0 + uniforms.i_time) / 8.0;
        d = abs(d);

        d = pow(0.01 / d, 1.2);

        final_color += col * d;
    }

    return vec4<f32>(final_color * m.y * 5.0, 1.0);
}