// shaders/default.wgsl struct Uniforms { i_resolution: vec3, i_time: f32, i_mouse: vec4, }; @group(0) @binding(0) var uniforms: Uniforms; fn palette(t: f32) -> vec3 { let a = vec3(0.5, 0.5, 0.5); let b = vec3(0.5, 0.5, 0.5); let c = vec3(1.0, 1.0, 1.0); let d = vec3(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 { // Full-screen triangle let pos = vec2( f32(vertex_index == 0u) * 4.0 - 1.0, f32(vertex_index == 1u) * 4.0 - 1.0 ); return vec4(pos, 0.0, 1.0); } @fragment fn fs_main(@builtin(position) frag_coord: vec4) -> @location(0) vec4 { 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(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(final_color * m.y * 5.0, 1.0); }