1 of 16

La pipeline moderna de OpenGL

Entendiendo el orden en que ocurren las cosas.

By Romualdo Villalobos

2 of 16

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.

3 of 16

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.

4 of 16

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.

5 of 16

Desde aquí podremos “teselar” una forma primitiva ,es decir subdividir una superficie en figuras/primitivas más pequeñas.

Esta etapa es opcional.

6 of 16

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.

7 of 16

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.

8 of 16

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.

9 of 16

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.

10 of 16

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).

11 of 16

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.

12 of 16

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).

13 of 16

14 of 16

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.

15 of 16

Simulamos juntos el pipeline gráfico.

Ejercicios

16 of 16

Bibliografía