aboutsummaryrefslogtreecommitdiffstats
path: root/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'shaders')
-rw-r--r--shaders/default.wgsl51
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);
+}