06 Capítulo 6 · Lección 12

Shaders Animados

Redactado por
Author Sebastian V.
Fecha de publicación

04/05/2026

Tiempo de lectura

6 min

Tema

Shaders GLSL

El reloj de la GPU

Hemos usado el tiempo antes, pero aquí profundizaremos en su poder. Un u_time que se incrementa en cada frame es el motor absoluto de la vida en los Shaders. Funciona como un contador de segundos desde que la página cargó.

El poder de las funciones periódicas

Si multiplicas una coordenada UV por el tiempo (vUv.x * u_time), el shader explotará visualmente en un borrón estroboscópico casi de inmediato. El tiempo crece hasta el infinito. Necesitas atrapar el tiempo en un ciclo repetitivo.

Aquí es donde brillan las funciones matemáticas como sin(), cos(), o fract(). Un sin(u_time) garantiza que, sin importar cuánto avance el reloj, tu valor siempre estará rebotando suavemente entre -1.0 y 1.0 en un loop perfecto.

Animación Espacial

Si mezclas u_time con las coordenadas espaciales (vUv.y + u_time), creas un efecto de desplazamiento continuo. Es la base de las cascadas, los túneles infinitos y el fuego.

El Patrón en Movimiento

> _
uniform float u_time;
varying vec2 vUv;

void main() {
  // Movemos las coordenadas X restando el tiempo
  vec2 animatedUv = vUv;
  animatedUv.x -= u_time * 0.5;

  // fract() repite el valor entre 0.0 y 1.0 (crea las barras)
  float pattern = fract(animatedUv.x * 5.0);

  // Colores Genesis Pixel
  vec3 colorA = vec3(0.04, 0.06, 0.1);
  vec3 colorB = vec3(0.988, 0.364, 0.490);

  // Usamos step para hacer cortes secos
  vec3 finalColor = mix(colorA, colorB, step(0.5, pattern));

  gl_FragColor = vec4(finalColor, 1.0);
}
> _

Barras infinitas creadas sumando u_time a las coordenadas UV antes de usar fract().

Errores comunes

01
Multiplicar el tiempo a lo loco u_time crece constante. Si haces sin(u_time * 100.0), el shader parpadeará epilépticamente. Usa multiplicadores pequeños: sin(u_time * 0.5) para una respiración calmada.

Practica lo aprendido

Domina el pulso del tiempo.

01 Instancia un THREE.Clock() en JS y pasa su getElapsedTime() al u_time.
02 Usa sin(u_time) para modificar un color o escalar un radio gradualmente.
03 Usa fract(vUv.x - u_time) para crear un patrón de líneas que se muevan hacia la derecha.