06 Capítulo 6 · Lección 10

Distorsiones

Redactado por
Author Sebastian V.
Fecha de publicación

26/04/2026

Tiempo de lectura

7 min

Tema

Shaders GLSL

Derritiendo la web

Uno de los efectos más premium que verás en agencias digitales de alto nivel es la distorsión de imágenes. Cuando pasas el ratón por encima de una foto de un proyecto y ésta se ondula como si estuviera bajo el agua.

¿Cómo se distorsiona una imagen?

La imagen se envía al shader como una textura (uniform sampler2D u_image;). En condiciones normales, lees el color de la textura usando texture2D(u_image, vUv), pidiendo exactamente el color que corresponde a la coordenada actual.

Pero... ¿qué pasa si le mientes a la función? ¿Qué pasa si le pasas unas UVs ligeramente desplazadas usando ruido o funciones seno?

La matemática del engaño

Si la coordenada actual es (0.5, 0.5) pero le dices a la textura que lea el color de (0.5 + sin(time), 0.5), terminarás leyendo colores de otros lados de la imagen, creando un efecto óptico de ondulación líquida o distorsión sin modificar el archivo original ni el DOM.

El Espejo de Agua

> _
uniform float u_time;
uniform sampler2D u_texture;
varying vec2 vUv;

void main() {
  vec2 distortedUv = vUv;
  
  // Desplazamiento en X basado en Y y el tiempo
  distortedUv.x += sin(vUv.y * 10.0 + u_time) * 0.03;
  // Desplazamiento en Y basado en X y el tiempo
  distortedUv.y += cos(vUv.x * 10.0 + u_time) * 0.03;

  // Leemos la textura usando las coordenadas mentirosas
  vec4 textureColor = texture2D(u_texture, distortedUv);

  gl_FragColor = textureColor;
}
> _

Generamos un mapa procedural en el Fragment y lo usamos para desviar la lectura de una textura.

Errores comunes

01
La textura no se carga Pasaste la textura como uniform de tipo sampler2D pero olvidaste definirla como tal en el shader (uniform sampler2D u_texture;). Sin ese tipo exacto el compilador falla.
02
Distorsión demasiado agresiva El offset que le sumas a las UVs es demasiado grande y la imagen se parte o pierde su forma. Mantén el rango de offset entre 0.01 y 0.05 para distorsiones elegantes y realistas.

Practica lo aprendido

Engaña a la cámara de la textura.

01 Recibe una textura en tu Fragment Shader usando sampler2D.
02 Copia vUv a una nueva variable (vec2 distortedUv = vUv).
03 Súmale ruido o funciones matemáticas a distortedUv y úsala en texture2D.