Uniforms y shaders: cómo crear reveal y distorsión sin perder mantenibilidad

Aprende a usar uniforms en shaders para construir efectos de reveal, máscara y distorsión controlados por GSAP o por interacción. La meta no es escribir un shader enorme, sino entender el puente entre tiempo, GPU y dirección visual.

Hay un punto en el que los materiales estándar se quedan cortos. No porque sean malos, sino porque ciertos efectos de reveal, distorsión o máscara necesitan lógica propia en GPU. Ahí entran los shaders y, dentro de ellos, los uniforms como puente entre tu aplicación y el material.

Un uniform es una variable global que la CPU puede enviar a la GPU. Si GSAP anima ese valor, el shader recibe una secuencia temporal continua y puede traducirla en expansión de una máscara, mezcla de texturas o deformación controlada.

La clave de esta lección es no caer en el hype. No necesitas un shader gigantesco para conseguir valor real. A menudo basta con uno o dos uniforms bien elegidos y una lógica clara para pasar de un simple fade a un reveal mucho más expresivo.

Cuando termines deberías entender qué parte gestiona GSAP, qué parte resuelve el shader y cómo mantener el efecto bajo control sin crear una pieza imposible de depurar.

  • GSAP no anima píxeles; anima valores que el shader interpreta.
  • Cuando animas `uniforms.uProgress.value`, no estás diciendo directamente cómo se dibuja cada fragmento. Estás moviendo una variable que el shader usa para decidir qué mostrar, mezclar o deformar. Esa separación es importante porque mantiene el rol de cada capa: GSAP dirige el tiempo; el shader ejecuta la visualización.
  • Este patrón es muy potente porque te permite construir una gramática visual compleja sin delegar la lógica temporal a `useFrame` para todo.
  • Una máscara simple ya puede mejorar mucho la entrada de un producto o de una textura.
  • Un patrón muy común consiste en usar `uProgress` para expandir una máscara circular o lineal sobre unas coordenadas UV. Así el contenido no aparece simplemente con opacidad, sino que se revela con una lógica espacial más interesante.

Uniforms: el puente entre la lógica temporal y la GPU

GSAP no anima píxeles; anima valores que el shader interpreta.

Cuando animas `uniforms.uProgress.value`, no estás diciendo directamente cómo se dibuja cada fragmento. Estás moviendo una variable que el shader usa para decidir qué mostrar, mezclar o deformar. Esa separación es importante porque mantiene el rol de cada capa: GSAP dirige el tiempo; el shader ejecuta la visualización.

Este patrón es muy potente porque te permite construir una gramática visual compleja sin delegar la lógica temporal a `useFrame` para todo.

Reveal con máscara: uno de los usos más rentables

Una máscara simple ya puede mejorar mucho la entrada de un producto o de una textura.

Un patrón muy común consiste en usar `uProgress` para expandir una máscara circular o lineal sobre unas coordenadas UV. Así el contenido no aparece simplemente con opacidad, sino que se revela con una lógica espacial más interesante.

Esto funciona especialmente bien en transiciones de producto, pantallas, texturas o superficies donde quieres que la aparición tenga dirección.

Distorsión: úsala como énfasis, no como castigo visual

Una pequeña deformación suele ser más elegante que un efecto agresivo permanente.

GSAP puede animar un uniform de ruido, fuerza o amplitud para que el shader distorsione temporalmente una textura o una superficie. El valor está en el momento: entrada, hover, scroll concreto o cambio de estado.

Si la distorsión vive siempre en pantalla, desgasta rápido y suele perjudicar la lectura del producto. En cambio, como gesto puntual puede dar muchísima personalidad.

Cómo evitar que el shader se convierta en una caja negra

La mejor defensa es limitar variables y nombrarlas con intención.

Un shader se vuelve difícil de mantener cuando acumula uniforms ambiguos y lógica sin propósito visible. Conviene empezar por efectos pequeños, con nombres explícitos como `uProgress`, `uRadius`, `uDistortion` o `uMouse`.

Si el efecto no puede explicarse en una frase clara, probablemente todavía no conviene meterlo en producción.

Debug común: el uniform cambia, pero el efecto no se entiende

El problema suele ser conceptual, no de sintaxis.

Si el reveal apenas se percibe, revisa rango, contraste y punto de referencia en UV. Si la distorsión rompe demasiado la textura, baja amplitud antes de tocar el tiempo. Y si el efecto parece arbitrario, quizá el shader no está respondiendo a una necesidad de la narrativa, sino a una tentación técnica.

No confundas complejidad de GPU con calidad visual. En producto, la legibilidad sigue mandando.

Animaciones 3D en la Web
08

Uniforms y shaders: cómo crear reveal y distorsión sin perder mantenibilidad

Aprende a usar uniforms en shaders para construir efectos de reveal, máscara y distorsión controlados por GSAP o por interacción. La meta no es escribir un shader enorme, sino entender el puente entre tiempo, GPU y dirección visual.

Código del tema: uniforms · shader · reveal

📘 Teoría

Uniforms: el puente entre la lógica temporal y la GPU

GSAP no anima píxeles; anima valores que el shader interpreta.

Cuando animas `uniforms.uProgress.value`, no estás diciendo directamente cómo se dibuja cada fragmento. Estás moviendo una variable que el shader usa para decidir qué mostrar, mezclar o deformar. Esa separación es importante porque mantiene el rol de cada capa: GSAP dirige el tiempo; el shader ejecuta la visualización.

Este patrón es muy potente porque te permite construir una gramática visual compleja sin delegar la lógica temporal a `useFrame` para todo.

La idea base
gsap.to(material.uniforms.uProgress, {
  value: 1,
  duration: 1.2,
  ease: 'power2.out'
});

Reveal con máscara: uno de los usos más rentables

Una máscara simple ya puede mejorar mucho la entrada de un producto o de una textura.

Un patrón muy común consiste en usar `uProgress` para expandir una máscara circular o lineal sobre unas coordenadas UV. Así el contenido no aparece simplemente con opacidad, sino que se revela con una lógica espacial más interesante.

Esto funciona especialmente bien en transiciones de producto, pantallas, texturas o superficies donde quieres que la aparición tenga dirección.

Distorsión: úsala como énfasis, no como castigo visual

Una pequeña deformación suele ser más elegante que un efecto agresivo permanente.

1

GSAP puede animar un uniform de ruido, fuerza o amplitud para que el shader distorsione temporalmente una textura o una superficie. El valor está en el momento: entrada, hover, scroll concreto o cambio de estado.

2

Si la distorsión vive siempre en pantalla, desgasta rápido y suele perjudicar la lectura del producto. En cambio, como gesto puntual puede dar muchísima personalidad.

Cómo evitar que el shader se convierta en una caja negra

La mejor defensa es limitar variables y nombrarlas con intención.

Un shader se vuelve difícil de mantener cuando acumula uniforms ambiguos y lógica sin propósito visible. Conviene empezar por efectos pequeños, con nombres explícitos como `uProgress`, `uRadius`, `uDistortion` o `uMouse`.

Si el efecto no puede explicarse en una frase clara, probablemente todavía no conviene meterlo en producción.

Debug común: el uniform cambia, pero el efecto no se entiende

El problema suele ser conceptual, no de sintaxis.

Si el reveal apenas se percibe, revisa rango, contraste y punto de referencia en UV. Si la distorsión rompe demasiado la textura, baja amplitud antes de tocar el tiempo. Y si el efecto parece arbitrario, quizá el shader no está respondiendo a una necesidad de la narrativa, sino a una tentación técnica.

No confundas complejidad de GPU con calidad visual. En producto, la legibilidad sigue mandando.

🧭 Visuales clave

Puente entre GSAP, uniforms y shader

Aclara qué capa temporal controla GSAP, qué información viaja en el uniform y qué resuelve finalmente la GPU.

Diagrama del flujo desde GSAP hacia un uniform y desde ese uniform hacia un reveal o distorsión en shader

🧪 Aprende probando

Ejemplo Demo guiada: reveal radial con progreso animable Este preview reproduce la lógica visual de un reveal con máscara radial para que puedas entender el papel del uniform sin necesidad de compilar un shader real aquí.
Ejemplo Ejemplo resuelto: uniform animado con GSAP El patrón clave es este: GSAP anima el valor; el shader interpreta ese valor para decidir qué muestra.

🏁 Retos

Reto Reto 5: plantea un reveal simple con un único uniform principal Tu objetivo es evitar el shader inflado: diseña un reveal claro que pueda explicarse con `uProgress` y, como mucho, un parámetro auxiliar.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .