La pipeline moderna de OpenGL
Entendiendo el orden en que ocurren las cosas.
By Romualdo Villalobos
Nuestra aplicación define un conjunto de puntos que enviaremos al pipeline (esto se configura desde la CPU).
Estos puntos se usarán en una etapa posterior para definir los bordes de las primitivas que se dibujaran.
Las primitivas son formas/shapes básicas como triángulos, líneas y puntos.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Vertex Processing
Esto permite al usuario personalizar la forma en que se procesan los puntos/vértices. Cada etapa representa un tipo diferente de operación.
Muchas de estas etapas son opcionales.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Desde aquí podremos modificar los puntos/vértices que entraron al pipeline, por ejemplo, cambiar su posición, o su orientación (rotarlos).
Esta etapa no es opcional. siempre deberemos especificar un Vertex Shader.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Desde aquí podremos “teselar” una forma primitiva ,es decir subdividir una superficie en figuras/primitivas más pequeñas.
Esta etapa es opcional.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Procesa cada primitiva entrante, devolviendo cero o más primitivas de salida.
La salida de un GS es cero o más primitivas simples, El GS es capaz de eliminar primitivas o teselarlas generando muchas primitivas para una sola entrada.
Esta etapa es opcional.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Los vértices ingresan a una etapa no programable o fixed, en inglés se les conoce como fixed-function processing steps.
Durante esta etapa ocurren varias cosas, una de las últimas es el clipping:
Clipping
Se recortan las primitivas. Recorte significa que las primitivas que se encuentran en el límite entre el interior del volumen de visualización y el exterior se dividen en varias primitivas, de modo que la primitiva resultante se encuentre en el volumen de visualización.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
El Primitive Assembly es el proceso de recopilar una serie de datos de vértices/puntos de las etapas anteriores y componerlo en una secuencia de formas primitivas.
El tipo de primitiva que quiere dibujar/renderizar el usuario determina cómo funciona este proceso.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Las primitivas que llegan a esta etapa se rasterizan en el orden en que llegaron. El resultado de rasterizar una primitiva es una secuencia de Fragments.
Un Fragment es un conjunto de estados que se utiliza para calcular los datos finales de un píxel en la imagen final.�
El estado de un Fragment incluye su posición en la pantalla y una lista de datos arbitrarios que se generaron desde el Vertex o Geometry shader.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Los datos de cada Fragment generados en la etapa previa son procesados por un Fragment Shader.
La salida del Fragment Shader son una lista de colores, que finalmente se usarán para generar la imagen que se ve en pantalla.
Esta etapa es opcional (pero muy común).
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Los datos generados por los Fragments pasan por una secuencia de pasos finales.
Pixel ownership test: falla si OpenGL no es dueño del píxel que representa el Fragment (si otra ventana se superpone con la ventana GL).
Scissor Test: Cuando está habilitada, la prueba falla si el píxel del fragmento se encuentra fuera de un rectángulo específico de la pantalla.
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Adicionalmente:
Stencil Test: lo usa el programador para arbitrariamente descartar Fragments.
Depth Test: Descarta Fragments dependiendo de su profundidad relativa (z-depth).
Color blending: Define cómo se combina el color del fragment si ya existía un color en la imagen final (framebuffer).
Gráfico tomado de www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Gráfico tomado de https://glumpy.github.io/modern-gl.html
Regresaremos a esta diapositiva cada vez que terminemos una nueva sección. Programar en OpenGL trata de saber controlar/configurar distintas partes del pipeline gráfico.
Simulamos juntos el pipeline gráfico.
Ejercicios