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

​