Bouncing Under Thin Clouds
This one didn't compile in your browser.
Sourceflat paper-cutout collage: smooth-min metaball clouds with offset drop shadows, squash-and-stretch bouncing disc SDFs, concentric sun-ring glow
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;
float smin(float a, float b, float k) {
float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0);
return mix(b, a, h) - k * h * (1.0 - h);
}
float cloud(vec2 p, float s) {
p /= s;
float d = length(p) - 0.08;
d = smin(d, length(p - vec2(0.085, -0.02)) - 0.06, 0.04);
d = smin(d, length(p - vec2(-0.09, -0.025)) - 0.055, 0.04);
d = smin(d, length(p - vec2(0.02, 0.045)) - 0.065, 0.04);
d = max(d, -p.y - 0.06);
return d * s;
}
vec3 layer(vec3 col, vec3 c, float d, float px) {
return mix(col, c, 1.0 - smoothstep(-px, px, d));
}
float shade(float d, float w) {
return 1.0 - smoothstep(0.0, w, d);
}
void main() {
vec2 uv = (gl_FragCoord.xy - 0.5 * u_resolution) / u_resolution.y;
float px = 1.5 / u_resolution.y;
float t = u_time;
vec3 col = mix(vec3(0.82, 0.89, 0.90), vec3(0.33, 0.60, 0.86), smoothstep(-0.3, 0.5, uv.y));
vec2 sp = vec2(-0.42, 0.24);
float sr = length(uv - sp);
float ang = atan(uv.y - sp.y, uv.x - sp.x);
float rays = smoothstep(0.2, 0.6, sin(ang * 9.0 + t * 0.15)) * exp(-sr * 2.2) * 0.18;
float rings = (0.5 + 0.5 * sin(sr * 38.0 - t * 0.9)) * exp(-sr * 4.5) * 0.35;
col = mix(col, vec3(1.0, 0.86, 0.52), clamp(rays + rings, 0.0, 1.0));
col = layer(col, vec3(1.0, 0.79, 0.33), sr - 0.1, px);
col = layer(col, vec3(1.0, 0.86, 0.48), max(sr - 0.1, -(length(uv - sp - vec2(0.03, -0.03)) - 0.1)), px);
for (int i = 0; i < 3; i++) {
float fi = float(i);
float s = 0.8 + 0.3 * fract(fi * 0.61);
vec2 c = vec2(mod(fi * 0.63 + t * (0.018 + 0.006 * fi), 1.9) - 0.95, 0.31 - fi * 0.11 + 0.01 * sin(t * 0.5 + fi * 2.0));
vec2 q = uv - c;
float d = cloud(q, s);
float ds = cloud(q - vec2(0.012, -0.015), s);
col = mix(col, col * vec3(0.80, 0.85, 0.92), 0.6 * shade(ds, 0.025));
col = layer(col, vec3(0.98, 0.97, 0.93), d, px);
col = layer(col, vec3(0.86, 0.90, 0.95), max(d, q.y + 0.02 * s), px);
}
float h1 = -0.17 + 0.05 * sin(uv.x * 2.6 + 1.0) + 0.02 * sin(uv.x * 6.0 + t * 0.1);
col = layer(col, vec3(0.88, 0.68, 0.40), uv.y - h1, px);
col = mix(col, vec3(0.95, 0.80, 0.52), (1.0 - smoothstep(-px, px, uv.y - h1)) * shade(h1 - uv.y, 0.02) * 0.6);
float h2 = -0.30 + 0.035 * sin(uv.x * 3.4 - 0.6);
vec3 field = vec3(0.66, 0.42, 0.27);
float furrow = smoothstep(0.35, 0.5, abs(fract((uv.x * 0.6 - uv.y * 1.8) * 4.0) - 0.5));
field *= 1.0 - 0.07 * furrow;
col = layer(col, field, uv.y - h2, px);
for (int i = 0; i < 3; i++) {
float fi = float(i);
float r = 0.05 + 0.008 * fi;
float bx = -0.30 + 0.30 * fi + 0.02 * sin(t * 0.3 + fi);
float gy = -0.30 + 0.035 * sin(bx * 3.4 - 0.6) - 0.05 - 0.03 * fi;
float b = abs(sin(t * 1.5 + fi * 2.1));
float sq = 1.0 - smoothstep(0.0, 0.3, b);
vec2 sc = vec2(1.0 + 0.22 * sq, 1.0 - 0.18 * sq);
float cy = gy + r * sc.y + b * 0.2;
vec2 e = (uv - vec2(bx + 0.01, gy)) / vec2(r * (1.15 - 0.45 * b), r * 0.28);
col = mix(col, col * 0.72, 0.55 * shade(length(e) - 1.0, 0.6));
vec2 q = (uv - vec2(bx, cy)) / sc;
float d = length(q) - r;
float ds = length(q - vec2(0.012, -0.015)) - r;
col = mix(col, col * 0.78, 0.45 * shade(ds, 0.02));
vec3 bc = vec3(0.95, 0.45, 0.35);
if (i == 1) bc = vec3(0.25, 0.62, 0.58);
if (i == 2) bc = vec3(0.98, 0.74, 0.25);
col = layer(col, bc, d, px);
col = layer(col, mix(bc, vec3(1.0, 0.96, 0.85), 0.35), max(d, -(length(q - vec2(0.018, -0.018)) - r)), px);
}
vec2 vu = gl_FragCoord.xy / u_resolution - 0.5;
col *= 1.0 - 0.25 * dot(vu, vu);
col = mix(col, col * vec3(1.03, 1.0, 0.95), 0.5);
gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}