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