1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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));
}
|