summaryrefslogtreecommitdiff
path: root/src/effects/scene2.wgsl
blob: 7df91c3b66c6db78c4beaea3dada916cd378d90d (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
// Scene2 effect shader - ShaderToy conversion (volumetric clouds)
// Generated by convert_shadertoy.py
// NOTE: Manual review recommended - conversion is basic

#include "sequence_uniforms"
#include "render/fullscreen_uv_vs"

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

fn N(a: vec3f, p: vec3f) -> f32 {
    return abs(dot(sin(uniforms.time + 0.1 * p.z + 0.3 * p / a), a + a));
}

@fragment fn fs_main(in: VertexOutput) -> @location(0) vec4f {
    let r = uniforms.resolution;
    let frag_coord = vec2f(in.position.x, r.y - in.position.y);
    let u = (frag_coord + frag_coord - r) / r.y;

    var p = vec3f(0.0);
    var col = vec4f(0.0);
    var s: f32 = 0.0;

    for (var i: f32 = 0.0; i < 100.0; i += 1.0) {
        p += vec3f(u * s, s);
        s = 6.0 + p.y;
        s -= N(vec3f(0.08), p);
        s -= N(vec3f(0.2), p);
        s -= N(vec3f(0.6), p);
        s = 0.1 + abs(s) * 0.2;
        col += vec4f(4.0, 2.0, 1.0, 0.0) / s;
    }

    col *= smoothstep(0.8, 0.75, abs(u.y));
    let len_u = max(length(u), 0.0001);
    col = tanh(col / 2000.0 / len_u);
    return vec4f(col.rgb, 1.0);
}