#version 430 layout(local_size_x = 1, local_size_y = 1) in; #include #include #include uniform float seconds = 0; layout(rgba8) uniform readonly image2D text_texture; layout(rgba8) uniform writeonly image2D output_image; uniform float antialiasing = 0.28; uniform bool enable_antialiasing = false; float digit(in vec2 uv, in int dig, in float size) { vec2 p = uv * 5000 / size; float digitSize = imageSize(text_texture).x / 10.; float digitOffset = digitSize * dig; p.x = clamp(p.x + digitOffset, digitOffset, digitOffset + digitSize); vec4 s = imageLoad(text_texture, ivec2(p)); return s.w; } float leaf_veins(in vec2 p) { float root = abs(p.y) - 0.022 * (1.0 - 0.7 * p.x); p.y = abs(p.y) - p.x; p.y = abs(p.y) - 0.20 * (p.x + 1.0); p.y = abs(p.y) - 0.11 * (p.x + 0.6); float veins = abs(p.y) - 0.022 * (1.0 - 0.9 * p.x); return min(root, veins); } vec3 image(vec2 uv) { const vec3 wall_color = srgb(0.70, 0.78, 0.64); const vec3 clock_hands_color = srgb(0.1, 0.2, 0.1); const vec3 vase_color = srgb(0.31, 0.22, 0.21); const vec3 vase_pat_color = mix(vase_color, vec3(0), 0.6); const vec3 floor_color = srgb(0.21, 0.218, 0.21); const vec3 petal_color = srgb(0.82, 0.36, 0.40); const vec3 pistal_color = srgb(0.63, 0.60, 0.33); const vec3 stem_color = srgb(0.18, 0.45, 0.22); const vec3 leaf_color = srgb(0.18, 0.45, 0.22); const vec3 frame_color = srgb(0.43, 0.30, 0.25); const vec3 dried_flower_color = srgb(0.34, 0.20, 0.0); vec3 color = wall_color; color = mix(color, mix(wall_color, vec3(0), 0.2), step(fbm(uv * 800), 0.24)); vec2 patp = uv * vec2(1, 1.5); vec3 shaded_floor_color = mix(floor_color, mix(floor_color, vec3(1), 0.1), clamp(fbm(100 * patp * fbm(10 * patp)) - 0.6, 0, 1)); color = mix(color, shaded_floor_color, step(uv.y, -0.16)); { const vec3 c1color = vec3(0.98, 0.66, 0.15); const vec3 c2color = vec3(0.26, 0.63, 0.28); const vec3 c3color = vec3(0.78, 0.16, 0.16); const vec3 c4color = vec3(0.13, 0.37, 0.60); vec2 framep = uv - vec2(-0.36, 0.26); float frame = sdf_box(framep, vec2(0.1), 0.006); color = mix(color, vec3(0), 1 - smoothstep(-0.01, 0.01, frame)); color = mix(color, mix(frame_color, vec3(0), 0.4), step(frame, 0)); color = mix(color, frame_color, step(frame + 0.007, 0)); color = mix(color, mix(frame_color, vec3(0), 0.4), step(frame + 0.025, 0)); float padd = sdf_box(framep, vec2(0.07), 0); float framecut = max(frame, -padd - 0.02); color = mix(color, vec3(0.8), step(padd, 0)); color = mix(color, c1color, step(padd, -0.02)); { vec2 p = framep * 30; float theta = atan(p.y, p.x); float art = (p.y / sin(theta)) - sin(2 * theta); float art2 = (p.y / sin(theta)) - 1.6 * sin(6 * theta); color = mix(color, c2color, (1 - step(framecut, 0)) * step(art2, 0)); color = mix(color, c2color, (1 - step(framecut, 0)) * step(art, 1.4)); color = mix(color, c4color, (1 - step(framecut, 0)) * step(art, 0.8)); color = mix(color, c3color, (1 - step(framecut, 0)) * step(art, 0.4)); color = mix(color, c1color, (1 - step(framecut, 0)) * step(art, 0)); } } { // clok vec2 clockp = uv - vec2(0.3, 0.26); float clock = sdf_circle(clockp, 0.06); color = mix(color, vec3(0), 1 - smoothstep(-0.05, 0.05, clock)); color = mix(color, srgb(0.34), step(clock, 0.02)); color = mix(color, srgb(0.28), step(clock, 0.004)); color = mix(color, vec3(1), step(clock, 0)); { vec2 digitp = clockp - vec2(0.0064, 0.022); float r = 0.046; float digit_size = 0.44; float angle = PI / 6.; for (int i = 0; i < 12; i++) { vec2 digitpos = digitp + vec2(0.011, 0.036) - r * vec2(cos(-i * angle + PI / 3), sin(-i * angle + PI / 3)); float s = 0; if (i + 1 >= 10) { s = digit(digitpos + vec2(0.0034, 0), 1, digit_size); digitpos.x -= 0.0034; } s = max(s, digit(digitpos, (i + 1) % 10, digit_size)); color = mix(color, mix(vec3(0), color, 0.4), s); } } { float theta = -PI - PI / 6; vec2 hhp = clockp; hhp *= mat2x2(cos(theta), -sin(theta), sin(theta), cos(theta)); float handh = sdf_box(hhp - vec2(0.013, 0), vec2(0.012, 0.0024), 0.006); color = mix(color, clock_hands_color, step(handh, 0)); } { float theta = -PI / 2; vec2 hmp = clockp; hmp *= mat2x2(cos(theta), -sin(theta), sin(theta), cos(theta)); float handm = sdf_box(hmp - vec2(0.016, 0), vec2(0.020, 0.0013), 0.0018); color = mix(color, clock_hands_color, step(handm, 0)); } color = mix(color, clock_hands_color, step(sdf_circle(clockp, 0.004), 0)); } vec2 vasep = uv - vec2(0.0, -0.18); float vase_shadow = sdf_circle((vasep + vec2(0.05, 0.176)) * vec2(0.2, 1) / 0.2, 0.062); color = mix(color, srgb(0.16), 1 - smoothstep(-0.01, 0.1, vase_shadow)); vec2 vase_openingp = vasep - vec2(0, 0.176); float vase_opening_pad = 0.01; float vase = sdf_box(vasep, vec2(0.08 + 0.02 * sin(23 * vasep.y + 1.9), 0.18), 0.01); float vase_opening = sdf_circle(vase_openingp * vec2(0.2, 1) / 0.2, 0.07); vase = min(vase, vase_opening); float vase_base = sdf_circle((vasep + vec2(0, 0.176)) * vec2(0.2, 1) / 0.2, 0.062); vase = min(vase, vase_base); color = mix(color, vase_color, step(vase, 0)); float vase_opening_cut = max(-vase_opening - vase_opening_pad, vase_openingp.y); { // vase vec2 patp = vasep - vec2(0, 0.11); float gap = 0.12; float id = round(patp.y / gap); patp.y -= gap * id; patp = patp - vec2(0, 0.16 * abs(sin(vasep.x))); float fun = cos(patp.x * 200) / 180.; float thicc = 0.0018; float pat = min(abs(patp.y - fun) - thicc, abs(-patp.y - fun) - thicc); color = mix(color, vase_pat_color, step(vase, 0) * step(min(pat, sdf_circle(patp, 0.002)), 0)); color = mix(color, mix(vase_color, vec3(0), 0.4), step(vase_opening, -vase_opening_pad)); color = mix(color, mix(color, vec3(0), 0.5), step(vase, 0) * (1 - smoothstep(0.08, 0.17, sdf_circle(vasep + vec2(0.13, 0.09), 0.01)))); } { // flower vec2 p = uv - vec2(-0.01, 0.07); { // stem vec2 sp1 = p; vec2 sp2 = vasep - vec2(2.0, 0); float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x); float stem = p.y - theta * p.x + 0.01; color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.06), 0) * step(abs(stem) - 0.006, 0)); } vec2 fp1 = p * 20; float tilt = 1.4; vec2 fp2 = fp1 * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float theta1 = atan(fp1.y, fp1.x); float theta2 = atan(fp2.y, fp2.x); float r1 = max(fp1.y / sin(theta1), fp1.x / cos(theta1)); // to remove artifacts from r = inf float r2 = max(fp2.y / sin(theta2), fp2.x / cos(theta2)); float petals = min(r2 - sin(6 * theta2), r1 - sin(6 * theta1)); color = mix(color, mix(petal_color, dried_flower_color, 0.5), step(min(petals, 1.3 * r1 - sin(12 * theta1)), 0)); color = mix(color, mix(petal_color, vec3(0), 0.6), step(petals + 0.4, 0)); float pistal = sdf_circle(fp1, 0.14); vec3 piscolor = pistal_color; piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal)); color = mix(color, piscolor, step(pistal, 0)); } { // flower vec2 p = uv - vec2(-0.10, 0.095); { // stem vec2 sp1 = p; vec2 sp2 = vasep; float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x); float stem = p.y - theta * (p.x) + 0.08 * sin(p.y * 16); color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.06), 0) * step(abs(stem) - 0.006, 0)); } vec2 fp1 = p * 20; float tilt = 1.4; vec2 fp2 = fp1 * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float theta1 = atan(fp1.y, fp1.x); float theta2 = atan(fp2.y, fp2.x); float r1 = max(fp1.y / sin(theta1), fp1.x / cos(theta1)); // to remove artifacts from r = inf float r2 = max(fp2.y / sin(theta2), fp2.x / cos(theta2)); float petals = min(r2 - sin(6 * theta2), r1 - sin(6 * theta1)); color = mix(color, petal_color, step(min(petals, 1.3 * r1 - sin(12 * theta1)), 0)); color = mix(color, mix(petal_color, vec3(0), 0.5), step(petals + 0.4, 0)); float pistal = sdf_circle(fp1, 0.14); vec3 piscolor = pistal_color; piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal)); color = mix(color, piscolor, step(pistal, 0)); { // leaf vec2 leafp = p - vec2(0.13, -0.01); float tilt = 2.8; leafp *= mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float leafveins = leaf_veins(-leafp * 20 + vec2(1.4, 0)); leafp.x = clamp(leafp.x, 0, 0.1); float leaf = abs(leafp.y) - sin(32 * leafp.x) * sin(0.4 * leafp.x); color = mix(color, leaf_color, step(leaf + 0.01, 0)); color = mix(color, mix(leaf_color, vec3(0), 0.2), step(leaf + 0.01, 0) * step(leafveins, 0)); } } { // flower vec2 p = uv - vec2(-0.13, 0.04); { // stem vec2 sp1 = p; vec2 sp2 = vasep; float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x); vec2 pt = p + vec2(0.05, 0.009); float stem = pt.y - theta * (pt.x) + 0.09 * cos(pt.x * 26) - 0.14; color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.01), 0) * step(abs(stem) - 0.0024, 0)); } vec2 fp = p * 20; float tilt = 1.4; vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float theta = atan(fp.y, fp.x); float r = fp.x / cos(theta); theta = clamp(theta + PI, 0, PI); float theta1 = atan(fp1.y, fp1.x); float r1 = fp1.x / cos(theta1); theta1 = clamp(theta1 + PI, PI / 4, 5 * PI / 4); float petals = r - sin(6 * theta); petals = min(petals, r1 - sin(6 * theta1)); petals = min(petals, 1.3 * r - sin(12 * clamp(theta, 0, PI / 2 + PI / 4))); color = mix(color, mix(petal_color, vec3(0), -petals * 0.8), step(petals, 0)); { vec2 budp = p + vec2(0.006, 0.006); float tilt = 0.4; budp *= mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float bud = max(-(budp.y - (0.003) * abs(-sin(budp.x * 500) + sin(budp.x * 600))), sdf_circle(budp + vec2(0, 0.0078), 0.020)); color = mix(color, stem_color, step(bud, 0)); } } { // flower vec2 p = uv - vec2(-0.036, 0.); vec2 fp = p * 20; float tilt = 1.4; vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float theta = atan(fp.y, fp.x); float theta1 = atan(fp1.y, fp1.x); float petals = min(fp1.x / cos(theta1) - sin(6 * theta1), fp.x / cos(theta) - sin(6 * theta)); color = mix(color, petal_color, step(min(petals, 1.3 * fp.x / cos(theta) - sin(12 * theta)), 0)); color = mix(color, mix(petal_color, vec3(0), 0.5), step(petals + 0.4, 0)); float pistal = sdf_circle(fp, 0.14); vec3 piscolor = pistal_color; piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal)); color = mix(color, piscolor, step(pistal, 0)); } { // dead flower vec2 p = uv - vec2(0.11, 0.00); { // stem vec2 sp1 = p; vec2 sp2 = vasep; float theta = atan(sp2.y - sp1.y, sp2.x - sp1.x); float stem = p.y - 0.02 - theta * (p.x) + 0.08 * sin(p.x * 28 + 0.3); vec3 dried_stem_color = srgb(0.36, 0.32, 0.0); dried_stem_color = mix(dried_stem_color, vec3(0), fbm(p * 100)); color = mix(color, dried_stem_color, (1 - step(vase_opening_cut, 0)) * step(min(sp1.x, sp2.x), 0) * step(abs(stem) - 0.003, 0)); } vec2 fp = p * 20 + vec2(0, (p.y - 0.1) * fbm(p + 1)); float tilt = 1.4; vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)); float theta = atan(fp.y, fp.x); float theta1 = atan(fp1.y, fp1.x); float petals = min( fp1.x / cos(theta1) - sin(6 * theta1), fp.x / cos(theta) - sin(6 * theta)); vec3 dried_flower_color = dried_flower_color; dried_flower_color = mix(dried_flower_color, vec3(0), fbm(p * 100)); dried_flower_color = mix(dried_flower_color, color, step(fbm((p + vec2(0.8, 0.804)) * 20) - 0.3, 0)); color = mix(color, dried_flower_color, step(min(petals, 1.3 * fp.x / cos(theta) - sin(12 * theta)), 0)); color = mix(color, mix(dried_flower_color, vec3(0), 0.5), step(petals + 0.4, 0)); float pistal = sdf_circle(fp, 0.14); vec3 piscolor = pistal_color; piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal)); color = mix(color, piscolor, step(pistal, 0)); } return color; } vec3 antialiased_image(vec2 uv) { vec2 resolution = vec2(imageSize(output_image).xy); float s = antialiasing / max(resolution.x, resolution.y); vec3 sum = vec3(0); int count = 0; for (int i = -2; i < 2; i++) for (int j = -2; j < 2; j++, count++) sum += image(uv + vec2(i, j) * s); return sum / count; } void main() { vec2 resolution = vec2(imageSize(output_image).xy); float aspect_ratio = resolution.y / resolution.x; vec2 uv = (gl_GlobalInvocationID.xy - resolution / 2) * vec2(1.0, aspect_ratio) / resolution; vec3 color = enable_antialiasing ? antialiased_image(uv) : image(uv); imageStore(output_image, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1)); }