Vertex Shader es una etapa programable del pipeline gráfico que procesa cada vértice de un modelo 3D de forma independiente. Según Khronos Group, 2025, el shader de vértices recibe como entrada los atributos de los vértices — coordenadas, normales, color y coordenadas de textura — y los transforma según la lógica definida. Vertex Shader se ejecuta para cada vértice de forma independiente, lo que permite paralelizar eficientemente los cálculos en miles de núcleos de GPU.
Puntos clave
Vertex Shader es una etapa programable del pipeline gráfico que procesa cada vértice de un modelo 3D individualmente. Un vértice es un punto en un espacio tridimensional que contiene atributos: coordenadas xyz, normales, color y coordenadas de textura UV.
A diferencia del pipeline de función fija (fixed-function pipeline), donde las transformaciones se realizaban según un algoritmo rígido, Vertex Shader le da al desarrollador un control total sobre la transformación de vértices. Esto permite implementar animación procedural, deformación de modelos, skinning esquelético y cualquier transformación matemática en el lado de la GPU.
El pipeline gráfico de OpenGL ES incluye una secuencia de etapas desde los datos de entrada hasta la imagen final. Vertex Shader se encuentra después de la etapa de ensamblaje de vértices y antes de la etapa de rasterización. Cada vértice enviado desde la CPU a través de un búfer de vértices pasa por el Vertex Shader exactamente una vez, y el resultado se envía a la siguiente etapa para el ensamblaje de primitivas.
| Etapa del pipeline | Propósito |
|---|---|
| Vertex Specification | Transferencia de datos y atributos de vértices desde VBO |
| Vertex Shader | Procesamiento de cada vértice, transformación de coordenadas |
| Tessellation | Subdivisión opcional de la geometría en subprimitivas |
| Geometry Shader | Generación o eliminación opcional de primitivas |
| Rasterization | Conversión de primitivas en fragmentos para el relleno |
Vertex Shader recibe los atributos de los vértices desde el búfer de vértices (VBO) a través de punteros de atributos de vértice configurados en el código de la CPU. El desarrollador escribe el código del shader en GLSL (OpenGL Shading Language) o un lenguaje equivalente, que el controlador de la GPU compila en instrucciones de máquina para el chip específico.
Para cada vértice, el Vertex Shader realiza secuencialmente tres operaciones: lectura de atributos de entrada — aplicación de transformaciones definidas por el desarrollador — escritura de resultados en variables de salida. La salida mínima requerida es la posición del vértice en el espacio de recorte (gl_Position). Todos los demás datos de salida (color, normales, coordenadas de textura) se interpolan y se pasan a la siguiente etapa — el Fragment Shader.
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
Vertex Shader resuelve una amplia gama de tareas del pipeline gráfico relacionadas con la transformación de geometría. Cada tarea se implementa mediante operaciones matemáticas sobre vectores y matrices, ejecutadas en paralelo para miles de vértices simultáneamente.
La tarea básica y más común es multiplicar las coordenadas de los vértices por las matrices model, view y projection (MVP). La matriz MVP transforma un vértice del espacio local del modelo al espacio de recorte (clip space), que luego se normaliza y se convierte a coordenadas de pantalla en las etapas automáticas del pipeline.
Para personajes animados, el Vertex Shader implementa la animación esquelética (skinning). Cada vértice está vinculado a varios huesos con pesos específicos. Vertex blending — una suma ponderada de transformaciones de los huesos vinculados — permite deformar suavemente la piel del personaje cuando el esqueleto se mueve.
El Vertex Shader puede modificar la geometría basándose en el tiempo u otros parámetros uniform sin intervención de la CPU. Wave deformation, desplazamiento por ruido Perlin y efectos de ondas en el agua — todos estos efectos se implementan en el shader de vértices sin recargar la geometría desde la RAM.
Aunque ambos tipos de shaders son etapas programables del pipeline gráfico, Vertex Shader y Fragment Shader resuelven tareas fundamentalmente diferentes y operan en distintas etapas del procesamiento de imágenes.
| Característica | Vertex Shader | Fragment Shader |
|---|---|---|
| Datos de entrada | Atributos de vértices desde VBO | Datos interpolados desde VS |
| Número de invocaciones | Número de vértices | Número de fragmentos |
| Tarea principal | Transformación de geometría | Cálculo del color del píxel |
| Carga computacional | Complejidad de la geometría | Resolución de pantalla |
| Acceso a texturas | Limitado (mediante texture lookup) | Acceso completo |
La diferencia clave es la frecuencia de invocación. Vertex Shader se llama una vez por vértice, mientras que Fragment Shader se llama por cada fragmento (píxel). En una escena de alta resolución, el número de invocaciones de Fragment Shader supera al de Vertex Shader en miles de veces, lo que hace que la optimización de los shaders de píxeles sea aún más crítica.
El rendimiento de Vertex Shader es críticamente importante para aplicaciones en tiempo real, especialmente en el desarrollo móvil con consumo de energía limitado. Los principales factores de rendimiento son el número de vértices, la complejidad del código del shader y el ancho de banda de la memoria de la GPU.
Para reducir la carga en el Vertex Shader, se utilizan los siguientes enfoques. Level of Detail (LOD) — cambio a versiones simplificadas de modelos cuando la cámara se aleja del objeto. Instancing — dibujo repetido de la misma geometría con diferentes matrices de transformación en una sola llamada de dibujo (draw call).
// Vertex Shader con soporte de instancing
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;
void main() {
vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
gl_Position = uViewProjection * worldPos;
}
Vertex Shader en diferentes API gráficas tiene una lógica similar, pero diferente sintaxis y convenciones de nomenclatura. Veamos la implementación de un shader de vértices básico en GLSL para OpenGL ES 3.0 y en Metal Shading Language para iOS y macOS.
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;
void main() {
vec4 mvPosition = modelViewMatrix * position;
vPosition = mvPosition.xyz;
vNormal = normalMatrix * normal;
vTexCoord = texcoord;
gl_Position = projectionMatrix * mvPosition;
}
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
constant float4x4& mvp [[buffer(1)]]) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
Preguntas frecuentes
Vertex Shader es un programa en la GPU que procesa cada vértice de un modelo 3D y transforma sus coordenadas en coordenadas de pantalla. Imagine un modelo como una malla de puntos; el shader de vértices mueve estos puntos según reglas matemáticas definidas.
Vertex Shader procesa los vértices y se encarga de la geometría, mientras que Fragment Shader determina el color de cada píxel. El primero se llama por cada vértice (miles), el segundo por cada píxel (millones).
Vertex Shader se escribe en un lenguaje correspondiente a la API gráfica: GLSL para OpenGL ES, Metal Shading Language para Metal API en iOS/macOS, HLSL para Direct3D. Conceptualmente, todos realizan las mismas operaciones sobre los vértices.
La complejidad del shader de vértices afecta directamente a los FPS: más instrucciones por vértice = mayor tiempo de procesamiento. La optimización incluye reducir el número de vértices mediante LOD, usar instancing y minimizar las ramificaciones condicionales en el código del shader.
Principales tareas en juegos: transformación de coordenadas mediante matrices MVP, skinning de personajes animados, deformación procedural de ropa y cabello, morphing entre expresiones faciales y efectos de partículas con animación en GPU.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también