06 Capítulo 6 · Lección 3

Vertex Shaders

Redactado por
Author Sebastian V.
Fecha de publicación

29/03/2026

Tiempo de lectura

7 min

Tema

Shaders GLSL

Esculpiendo el espacio

Todo objeto en 3D está formado por puntos llamados Vértices. Una esfera tiene miles de vértices unidos por caras. Un plano tiene cuatro vértices en sus esquinas (o más, si lo subdivides).

El Vertex Shader es un programa que la GPU ejecuta una vez por cada vértice que existe en tu geometría. Su único objetivo en la vida es responder a la pregunta: "¿En qué coordenada exacta de la pantalla 2D del usuario debo dibujar este vértice 3D?".

La Variable Sagrada: gl_Position

Al final de tu Vertex Shader, debes asignar un vec4 a la variable reservada gl_Position. Para llegar ahí, tienes que multiplicar la posición original del vértice (position) por tres matrices mágicas que Three.js nos provee automáticamente:

  1. modelMatrix: Mueve el vértice desde el "centro de sí mismo" al "centro del mundo" (Scale, Rotation, Position del Mesh).
  2. viewMatrix: Ajusta esa posición según dónde esté parada la Cámara en el mundo.
  3. projectionMatrix: Aplica la perspectiva final (hace que lo lejano se vea más pequeño) para aplastar todo en la pantalla 2D.

Magia Procedural

Lo divertido del Vertex Shader es que, antes de multiplicar esas matrices, puedes hackear la variable position original matemáticamente. Por ejemplo, puedes sumar una onda sinusoidal a la posición Z de un plano, creando banderas ondeando al viento o agua realista, todo sin usar CPU.

Consejo profesional

Para deformar una geometría con el Vertex Shader, tu geometría base necesita tener suficientes vértices. Un BoxGeometry por defecto tiene solo 8 esquinas. Si intentas doblarlo por el centro con un Shader, no pasará nada porque no hay vértices en el medio para doblar.

Modificando Vértices

> _
uniform float u_time;

void main() {
  // 1. Copiamos la posición original en una variable que podamos modificar
  vec3 newPosition = position;

  // 2. MAGIA: Movemos el vértice en el eje Z usando una onda Sinusoidal basada en su eje X y el Tiempo
  newPosition.z += sin(newPosition.x * 5.0 + u_time) * 0.2;

  // 3. Proyección obligatoria de Three.js
  vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0);
  vec4 viewPosition = viewMatrix * modelPosition;
  vec4 projectedPosition = projectionMatrix * viewPosition;

  // 4. Salida
  gl_Position = projectedPosition;
}
> _

Una esfera deformada usando puras matemáticas en el Vertex Shader.

Errores comunes

01
Geometría sin suficientes vértices Si usas un PlaneGeometry(2, 2) por defecto, solo tiene 4 vértices (esquinas). Una ola sinusoidal en el vertex shader necesita docenas de puntos intermedios. Usa PlaneGeometry(2, 2, 64, 64) para subdividirla.
02
No multiplicar por las matrices Olvidaste multiplicar la posición modificada por projectionMatrix, viewMatrix y modelMatrix. Tu objeto aparacerá enorme, en la posición incorrecta o directamente en negro.

Practica lo aprendido

Domina las formas tridimensionales.

01 Recupera el atributo "position" por defecto de Three.js.
02 Añade ruido o senos a sus coordenadas (X, Y o Z).
03 Multiplica por las matrices Projection, View y Model.