sábado, 6 de julio de 2013

OpenGL 4.3 Pipeline

Vamos a explicar como funciona el pipeline de OpenGL 4.3.
Como es lógico junto con la API, el pipeline ha ido evolucionando a si que vamos a analizar la última versión. Los pasos que se le han añadido en la 4.3 son Tesselation y Compute, este último no lo vamos a ver aquí.


Foto que pertenece al libro oficial de programación en OpenGL: OpenGL Programming Guide Eight Edition. Que recomiendo encarecidamente su adquisición si tienes un nivel de ingles leído decente.
La foto ha sido obtenida de la página http://my.safaribooksonline.com que nos permite una previsualización del principio de todos los capítulos

Antes de nada: ¿que es un Shader?. Los que hemos jugado a minecraft nos suena la palabra shader y lo asociamos a "petar el PC".
Un Shader es un programa que se le pasa a la GPU y que nos permite cambiar información de las primitivas que se envían. Cuando escribimos un Shader podemos indicar una serie de parámetros de entrada como si fuera una función de cualquier lenguaje de programación, sólo que no tiene nada que ver la forma de ser llamada.
Cuando creamos un programa en OpenGL, básicamente definimos los vértices, color, texturas...

  • La primera de las fases (Vertex Shader) recibe los vértices colores de los vértices y texturas y con ello podemos modificar la posición de los vértices  el color y posición de la textura. Esta fase es obligatoria, pero el Shader puede ser tan simple como "coge vértice y pásalo".
  • Tessellation Shader recibe todos los vértices ya modificados por el vertex shader y permite crear más primitivas para poder hacer unos modelos más agradables. Esta fase es opcional.


  • Geometry Shader puede manipular las primitivas e incluso añadir nuevas. También es opcional.
  • Primitive Assembly, organiza toda la información que le llega en geometría dejándolo preparado para las siguientes dos fases.
  • Clipping, algunas veces alguno de los vértices está fuera de la ventana. Adapta esos vértices para que todos los píxel se queden dentro de la ventana.
  • Rasterization es la fase en la que se calculan todos los candidatos a ser uno de los píxel que aparezca en la pantalla. Cada uno de estos píxel se les llama fragment, como se puede deducir, son pasados al Fragment Shader.
  • El Fragment Shader es la última parte programable del pipeline, modifica el color de los píxel y puede modificar incluso la profundidad (posición en z). También puede terminar el procesado del fragmento descartándolo. Este shader es obligatorio, aunque al igual que el vertex puede ser tan simple como: "coge fragmento y pásalo"
  • Por último hay un per-fragment operation, que se encarga de decidir si un píxel debe ser pintado en función de su posición en z y lo que ya había en el z-buffer.

De todas estas fases sólo son programables los Shader (marcados en azul), el resto las maneja automáticamente la GPU.

La programación de shaders es casi imprescindible y tremendamente potente, una GPU esta especializada en cálculos en coma flotante y tratamiento de imágenes. Poder delegar cálculos a la gráfica ya es un avance, pero poder manejar incluso cada píxel que se vaya a dibujar deja una infinidad de posibilidades para realismo en gráficos.

No hay comentarios:

Publicar un comentario