06 Capítulo 6 · Lección 5

Uniforms

Redactado por
Author Sebastian V.
Fecha de publicación

06/04/2026

Tiempo de lectura

8 min

Tema

Shaders GLSL

El mensajero de la CPU a la GPU

Hemos visto que los Shaders corren aislados en la GPU haciendo puras matemáticas. Pero, ¿qué pasa si quieres que el color cambie basado en un input de React en tu página? ¿O qué pasa si quieres que un plano se anime con el paso del tiempo?

El Shader está ciego y no tiene acceso a las variables globales de JavaScript, ni a Date.now(), ni a window.innerWidth.

¿Qué es un Uniform?

Un Uniform es una variable de "solo lectura" que enviamos desde nuestro código JavaScript (CPU) hacia el código del Shader (GPU). Se llama "uniform" porque su valor es uniforme (es el mismo) para todos los millones de píxeles y vértices procesados en ese frame exacto.

Los clásicos: u_time y u_resolution

Hay dos uniforms que usarás en el 99% de tus shaders creativos:

  • u_time (float): Le mandas el tiempo transcurrido desde Three.js para usarlo en funciones seno/coseno dentro del shader y darle vida y movimiento a la escena.
  • u_resolution (vec2): Le mandas el ancho y alto del <canvas> para que el shader sepa mantener la proporción de los dibujos en la pantalla y no aplastarlos al redimensionar la ventana.

Consejo profesional

Enviar Uniforms no es gratis. Tienen un costo de comunicación entre el procesador y la tarjeta gráfica. Si vas a enviar variables de JavaScript (como la posición del ratón o el scroll), hazlo dentro del bucle requestAnimationFrame usando 'material.uniforms.u_mouse.value = X'.

El Puente entre JS y GLSL

> _
import * as THREE from 'three';

// 1. Declarar Uniforms en el Material
const material = new THREE.ShaderMaterial({
  vertexShader,
  fragmentShader,
  uniforms: {
    u_time: { value: 0.0 },
    u_color: { value: new THREE.Color('#FC5D7D') }
  }
});

const clock = new THREE.Clock();

function animate() {
  requestAnimationFrame(animate);
  
  // 2. Actualizar el Uniform del tiempo cada frame!
  material.uniforms.u_time.value = clock.getElapsedTime();
  
  renderer.render(scene, camera);
}
> _

El color late porque el JS le está enviando un valor constante de u_time que aumenta cada frame.

Errores comunes

01
El Shader no compila Olvidaste usar la palabra reservada "uniform" antes de declarar la variable dentro del código GLSL, o los tipos de datos no coinciden (mandaste un new THREE.Color() desde JS pero lo recibiste como float en GLSL).

Practica lo aprendido

Inyecta datos dinámicos.

01 Declara la variable en el objeto uniforms de JS.
02 Recibe la variable en GLSL usando la palabra clave uniform.
03 Actualiza el .value de tu uniform en el loop de requestAnimationFrame.