An attempt at a demo effect
Log in to post a comment.
#version 300 es
precision highp float;
uniform float iTime;
uniform vec2 iResolution;
out vec4 fragColor;
// 2×2 rotation matrix
mat2 rot(float a) {
float c = cos(a), s = sin(a);
return mat2(c, -s, s, c);
}
// Metaball contribution: radius ÷ distance
float metaball(vec2 p, vec2 c, float r) {
return r / length(p - c);
}
// Simple HSV→RGB palette cycling
vec3 palette(float t) {
return vec3(
0.5 + 0.5 * cos(6.2831*(t + 0.00)),
0.5 + 0.5 * cos(6.2831*(t + 0.33)),
0.5 + 0.5 * cos(6.2831*(t + 0.67))
);
}
void main() {
// normalize coords to [-1,+1], preserve aspect
vec2 uv = (gl_FragCoord.xy / iResolution.xy) * 2.0 - 1.0;
uv.x *= iResolution.x / iResolution.y;
float t = iTime * 0.6;
// generate 5 orbiting blob centers
vec2 centers[5];
for (int i = 0; i < 5; i++) {
float ang = t * (1.0 + float(i)*0.3) + float(i)*1.2;
centers[i] = rot(ang) * vec2(0.5, 0.0);
}
// accumulate metaball field
float field = 0.0;
for (int i = 0; i < 5; i++) {
field += metaball(uv, centers[i], 0.3);
}
// smooth threshold to get a soft outline
float iso = smoothstep(1.8, 2.0, field);
// drive colour by field + time
float cpos = fract(field * 0.2 - t*0.1);
vec3 col = palette(cpos);
fragColor = vec4(col * iso, 1.0);
}