diff options
Diffstat (limited to 'shaders/default.wgsl')
| -rw-r--r-- | shaders/default.wgsl | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/shaders/default.wgsl b/shaders/default.wgsl new file mode 100644 index 0000000..b721c82 --- /dev/null +++ b/shaders/default.wgsl @@ -0,0 +1,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); +} |
