learn GLSL from zero
ToolsCrea con shadersShader MakerCrea shaders gratis en líneaToolkitObras de shaders listas para tu webSketcher LabPinta el hero de tu landing con shaders3D StudioEl editor Three.js en tu navegador
GamesJuega con shadersOnomatoShaderEscribe una palabra y explótalaThe WatcherUn ojo que te sigueAetherVidrio líquido con un ojo adentroBloomcoreUna palabra hace crecer un jardín de luzPyrokineAvienta fuego a la paredVoltaicLa pirámide lanza rayosSurfSurfea un océano de shader

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.
PruebaCambia 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.);
}
close