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);
}
|