Semestre 02, 2026
Conjunto ordenado de etapas que transforma una escena 3D en la imagen 2D que aparece en la pantalla.
Atajo optimizado que proyecta la geometría sobre la pantalla y rellena los píxeles que cubre. Es rápido y por eso lo usa el hardware gráfico.
Simulación física del recorrido de la luz. Es más fiel a la realidad y mucho más lento, porque cada rayo se resuelve contra toda la escena.
flowchart TD
A["1 Aplicacion (CPU)"] --> B["2 Vertex Shader"]
B --> C["3 Primitive Assembly y Clipping"]
C --> D["4 Rasterizacion"]
D --> E["5 Fragment Shader"]
E --> F["6 Operaciones por fragmento"]
F --> G["Framebuffer"]
classDef prog fill:#8839ef,stroke:#8839ef,color:#ffffff;
class B,E prog
Etapa cuyo comportamiento lo define un programa escrito por el desarrollador. Ese programa se llama shader y se ejecuta dentro de la GPU.
Etapa implementada en el hardware. No se reescribe, solo se configura con parámetros como el modo de dibujo o la función de profundidad.
| Etapa | Dónde corre | Naturaleza |
|---|---|---|
| Aplicación | CPU | Código propio |
| Vertex shader | GPU | Programable |
| Primitive assembly y clipping | GPU | Fija |
| Rasterización | GPU | Fija |
| Fragment shader | GPU | Programable |
| Operaciones por fragmento | GPU | Fija configurable |
Primera etapa del pipeline. Se ejecuta en el procesador principal y prepara todos los datos que la GPU necesitará para dibujar el cuadro.
Orden que la aplicación envía a la GPU para que dibuje un conjunto de vértices con un programa de shaders y una configuración determinados.
Primera etapa programable de la GPU. Recibe un vértice con sus atributos y devuelve ese mismo vértice transformado al clip space.
Punto del espacio que define una esquina de la geometría del modelo.
Dato adjunto a un vértice, distinto para cada uno, que la aplicación envía junto con la posición.
flowchart TD
A["Model space"] -->|"Matriz de modelo"| B["World space"]
B -->|"Matriz de vista"| C["View space"]
C -->|"Matriz de proyeccion"| D["Clip space"]
D -->|"Perspective divide"| E["NDC"]
E -->|"Viewport transform"| F["Screen space"]
classDef vs fill:#8839ef,stroke:#8839ef,color:#ffffff;
class B,C,D vs
| Espacio | Significado |
|---|---|
| Model space | Coordenadas tal como las guardó el archivo del modelo, con su propio origen. |
| World space | El objeto ya colocado en la escena, junto a los demás. |
| View space | La escena vista desde la cámara, que queda en el origen. |
| Clip space | El resultado de aplicar la proyección, listo para recortarse. |
| NDC | Coordenadas normalizadas en el rango de menos uno a uno. |
| Screen space | Píxeles reales dentro de la ventana. |
Matriz de 4x4 que aplica traslación, rotación y escala a los vértices para colocar el objeto en su lugar dentro de la escena.
Traslación de cinco unidades sobre el eje x.
$$ M = \begin{bmatrix} 1 & 0 & 0 & 5 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \qquad M \cdot (x, y, z, 1) = (x+5,\; y,\; z,\; 1) $$Matriz que mueve toda la escena para que la cámara quede en el origen mirando hacia el eje z negativo.
Matriz que define el frustum, que es el volumen de espacio visible, y aplasta ese volumen dentro del cubo del clip space.
Representación de un punto de tres dimensiones con una cuarta componente \(w\), que permite expresar la traslación como una multiplicación de matrices.
Las normales no se transforman con la matriz de modelo, sino con su inversa transpuesta.
La posición del vértice en clip space, que en OpenGL se escribe en la variable gl_Position.
Los atributos que seguirán viajando hacia el fragment shader, como la normal, la coordenada UV y el color.
Variable global de un programa de shaders cuyo valor fija la aplicación desde la CPU y que permanece constante durante todo el draw call.
| Dato | Quién lo produce | Cada cuánto cambia |
|---|---|---|
| Atributo | La aplicación, en el buffer de vértices | En cada vértice |
| Uniform | La aplicación, antes del draw call | En cada draw call |
| Varying | El vertex shader | En cada fragmento |
Valor que el vertex shader entrega y que la rasterización interpola a lo largo de la primitiva antes de pasarlo al fragment shader.
Se requiere que una esfera lata, creciendo y encogiéndose sin parar, sin volver a cargar el modelo ni tocar sus vértices en la CPU.
Etapa que agrupa los vértices ya transformados para formar primitivas, que son las figuras básicas que el hardware sabe dibujar.
Tres puntos siempre definen un plano y la figura nunca queda cóncava, así que la interpolación de atributos sobre su superficie está bien definida.
| Modo | Cómo agrupa los vértices |
|---|---|
| GL_POINTS | Cada vértice se dibuja por separado. |
| GL_LINES | Cada par de vértices forma una línea independiente. |
| GL_LINE_STRIP | Cada vértice se encadena con el anterior. |
| GL_LINE_LOOP | Igual que la cadena, pero el último se une con el primero. |
| GL_TRIANGLES | Cada grupo de tres vértices forma un triángulo. |
| GL_TRIANGLE_FAN | Todos los triángulos comparten el primer vértice. |
Descarte de los triángulos que le dan la espalda a la cámara, decidido por el orden en que están escritos sus tres vértices.
Arrastrar los puntos sobre el lienzo.
Recorte de las primitivas contra el frustum, de modo que solo sobrevive la parte que cae dentro del volumen visible.
Arrastrar los puntos sobre el lienzo.
División de las tres primeras componentes del vértice entre su componente \(w\), que convierte el clip space en coordenadas normalizadas.
Mapeo final que lleva las coordenadas normalizadas al rango de píxeles de la ventana donde se está dibujando.
Arrastrar los puntos sobre el lienzo.
Conversión de cada primitiva en el conjunto de fragmentos que cubre sobre la cuadrícula de la pantalla.
Rectángulo mínimo alineado a los ejes que contiene por completo al triángulo que se va a rasterizar.
Arrastrar los puntos sobre el lienzo.
Tres pesos que expresan un punto del triángulo como combinación de sus vértices, calculados como razones de áreas.
Arrastrar los puntos sobre el lienzo.
Cualquier atributo del punto interior se arma con los mismos tres pesos.
$$ A_P = \lambda_1 A_A + \lambda_2 A_B + \lambda_3 A_C $$Un triángulo con coordenadas UV \(A=(0.5,\,0)\), \(B=(0,\,1)\) y \(C=(1,\,1)\). El punto \(P\) cae justo en el centro, con pesos iguales.
$$ u_P = 0.5\left(\tfrac{1}{3}\right) + 0\left(\tfrac{1}{3}\right) + 1\left(\tfrac{1}{3}\right) = 0.5 \qquad v_P = 0\left(\tfrac{1}{3}\right) + 1\left(\tfrac{1}{3}\right) + 1\left(\tfrac{1}{3}\right) \approx 0.67 $$Arrastrar los puntos sobre el lienzo.
Paquete de datos que la rasterización genera por cada posición de pantalla cubierta por una primitiva. Es un candidato a píxel.
Un fragmento con todos sus atributos ya interpolados, más los uniforms del draw call.
Un color de cuatro componentes, que son rojo, verde, azul y alfa.
Un fragmento llega con la coordenada \((u, v) = (0.5,\, 0.25)\) y el material tiene asignada una textura de 512 por 512 píxeles.
Serie de pruebas fijas que decide si el color calculado por el fragment shader llega al framebuffer y cómo se combina con lo que ya estaba ahí.
Comparación entre la profundidad del fragmento y la que ya estaba guardada en esa posición. El fragmento solo pasa si está más cerca de la cámara.
Prueba contra una máscara guardada por píxel, que permite dibujar solo dentro de una región marcada. Se usa en espejos, recortes y siluetas.
Mezcla del color del fragmento con el que ya ocupaba el píxel, ponderada por el canal alfa. Es lo que produce el vidrio, el humo y las interfaces translúcidas.
Región de memoria que guarda el color de cada píxel de la imagen final, junto con los buffers auxiliares de profundidad y stencil.
| Etapa | Entrada | Salida |
|---|---|---|
| Aplicación | Archivo del modelo | Vértices y uniforms |
| Vertex shader | Un vértice | Vértice en clip space |
| Primitive assembly | Vértices sueltos | Triángulos |
| Clipping | Triángulos | Triángulos visibles |
| Rasterización | Triángulos | Fragmentos interpolados |
| Fragment shader | Un fragmento | Un color RGBA |
| Término | Definición |
|---|---|
| Shader | Programa que corre en la GPU dentro de una etapa programable. |
| Atributo | Dato que acompaña a un vértice y cambia en cada uno. |
| Uniform | Valor global que la CPU fija y permanece igual durante el draw call. |
| Varying | Salida del vertex shader que se interpola hacia el fragment shader. |
| Clip space | Espacio donde queda el vértice tras aplicar la proyección. |
| Frustum | Volumen de espacio que la cámara alcanza a ver. |
| Término | Definición |
|---|---|
| Primitiva | Figura básica que el hardware dibuja, punto, línea o triángulo. |
| Rasterización | Conversión de una primitiva en los fragmentos que cubre. |
| Fragmento | Candidato a píxel, con todos sus atributos interpolados. |
| Texel | Celda individual de una textura. |
| Z-buffer | Matriz que guarda la profundidad ya escrita en cada píxel. |
| Framebuffer | Memoria donde se arma la imagen final del cuadro. |