aboutsummaryrefslogtreecommitdiff
path: root/src/main/resources/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/resources/shaders')
-rw-r--r--src/main/resources/shaders/seigaiha.glsl72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/main/resources/shaders/seigaiha.glsl b/src/main/resources/shaders/seigaiha.glsl
new file mode 100644
index 0000000..b3afb4c
--- /dev/null
+++ b/src/main/resources/shaders/seigaiha.glsl
@@ -0,0 +1,72 @@
+#version 430
+layout(local_size_x = 1, local_size_y = 1) in;
+
+uniform float seconds = 0.;
+layout(rgba8) uniform writeonly image2D output_image;
+
+const float anti_aliasing = 0.0006;
+const float scale = 460.;
+const vec3 bg_color = vec3(1);
+const vec3 odd_color = vec3(0.156, 0.22, 0.396);
+const vec3 even_color = vec3(0.861, 0.702, 0.246);
+
+bool sdf(in vec2 p, bool even, inout float dist) {
+ float l = length(p);
+ float size = 0.13;
+ float ring_thickness = 0.006;
+ float min_gap = 0.01;
+ float speed = 1. / 200.;
+ if (even) speed = -speed;
+ bool even_iteration = int(seconds * speed / 0.05) % 2 == 0;
+ float gap_factor = even_iteration ? mod(seconds * speed, 0.05) : mod(-seconds * speed, 0.05);
+ if (l < size) {
+ float v = (l - size) * (l - size - 10);
+ for (float r = 0.02 + gap_factor, i = 0; r <= size; i++, r += ring_thickness) {
+ v *= (l - r);
+ r += min_gap + i * (0.0024 + gap_factor / 10);
+ v *= (l - r);
+ }
+ dist = v;
+ return true;
+ }
+ return false;
+}
+
+vec3 draw_shtuff(vec2 uv) {
+ vec2 period = vec2(0.11, 0.11);
+ vec2 pos = round(uv / period);
+
+ int odd = int(pos.x) % 2;
+ float yoffset = pos.y - 0.5 * odd;
+ float wing_yoffset = pos.y - odd - 0.5 * (1 - odd);
+ vec3 wing_color = mix(odd_color, even_color, 1 - odd);
+ vec3 body_color = mix(odd_color, even_color, odd);
+
+ float dist = -1;
+ vec3 active_color = bg_color;
+ if (sdf(uv - vec2(pos.x, yoffset) * period, odd == 0, dist))
+ active_color = body_color;
+ if (sdf(uv - vec2(pos.x + 1, wing_yoffset) * period, odd == 1, dist))
+ active_color = wing_color;
+ if (sdf(uv - vec2(pos.x - 1, wing_yoffset) * period, odd == 1, dist))
+ active_color = wing_color;
+ if (sdf(uv - vec2(pos.x, yoffset - 1) * period, odd == 0, dist))
+ active_color = body_color;
+
+ return dist > 0 ? vec3(pow(active_color.x, 2.2), pow(active_color.y, 2.2), pow(active_color.z, 2.2)) : bg_color;
+}
+
+vec3 anti_aliased_draw_shtuff(vec2 uv) {
+ vec3 sum = vec3(0);
+ int count = 0;
+ for (int i = -2; i < 2; i++)
+ for (int j = -2; j < 2; j++, count++)
+ sum += draw_shtuff(uv + vec2(i, j) * anti_aliasing);
+ return sum / count;
+}
+
+void main() {
+ vec2 uv = gl_GlobalInvocationID.xy / scale;
+ vec3 color = anti_aliased_draw_shtuff(uv);
+ imageStore(output_image, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1));
+}