Lección 5 de 10 · Animación en shaders
Morph
Círculo muta en hexágono. La forma no se decide.
Dos texturas, dos mundos. Quieres que uno se transforme en el otro. No un fade, una mutación.
El truco: dos domain warps diferentes y un mix() controlado por tiempo. Cuando t = 0, ves el material A. Cuando t = 1, el B. En medio: algo que no es ninguno.
mix() entre dos mundos. La materia muta.
Morph con mix()
mix(warpA, warpB, t) interpola entre dos domain warps. El resultado es una mutación, la estructura cambia, no solo la apariencia.Cambia el
0.5 (velocidad del morph) a 0.1 para transición ultra lenta. Cambia el 0.35 (radio común de las dos formas) a 0.5 y las formas crecen. Suma + 1. al T * 0.5 y el morph empieza desde el otro lado.El código
void main(){
vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
float t = sin(T * 0.5) * 0.5 + 0.5;
float r = 0.35;
float circ = length(p) - r;
vec2 ap = abs(p);
float hex = max(ap.x * 0.866 + ap.y * 0.5, ap.y) - r;
float d = mix(circ, hex, t);
float shape = smoothstep(0.02, -0.02, d);
vec2 sp = abs(p + vec2(.05, -.08));
float shd = mix(length(p+vec2(.05,-.08))-r, max(sp.x*.866+sp.y*.5,sp.y)-r, t);
float shadow = smoothstep(0.0, 0.3, shd);
vec3 col = vec3(0.02, 0.04, 0.05) * shadow;
col += mix(vec3(0.2,0.9,0.7), vec3(0.1,0.6,0.9), t) * shape;
col += vec3(0.1, 0.5, 0.5) * exp(-max(d,0.)*5.) * 0.4;
gl_FragColor = vec4(col, 1.);
}