Este post viene a ser una lista de conceptos a tener en cuenta para poder introducirse a OpenGL.

🔢 Matemáticas

Lo primero es inevitable, como Thanos, las matemáticas (‘◉⌓◉’)

Necesitaremos:

  • aritmética de vectores/matrices
  • trigonometría básica (conocer las operaciones cos y sin mínimo)

En cualquier libro de “matemáticas para videojuegos” hay un capítulo que habla sobre ello 🔢🧮

🖌️ OpenGL

Segundo debemos entender QUÉ es OpenGL 👉 es una API que te permite acceder a las capacidades de la GPU, nos abstrae de la complejidad de diferentes drivers y fabricantes y nos permite obtener/enviar información y comandos para dibujar en pantalla. Esto de forma MUY resumida.

Ejemplos de otras APIs de gráficos son: Vulkan, DirectX, Metal.

Pero para dibujar en pantalla, necesitamos algún tipo de lienzo sobre el que dibujar, ¿no? 🐸 Dicho de otra forma, necesitamos abrir una ventana donde la GPU pueda dibujar contenido 🎨 Como cada Sistema Operativo tiene un sistema de ventanas diferente, podemos usar una librería como GLFW que nos permite crear una ventana (y un contexto para OpenGL) de forma sencilla y sin preocuparnos del SO subyacente.

Una particularidad de OpenGL es que realmente es un estándar. Depende del fabricante/driver implementar la especificación de la API, además, las funciones de OpenGL necesitan ser cargadas en run-time.

“¿¿¿(●__●) y qué me quieres decir con eso???”

El caso es que para abstraernos de estos matices necesitaremos una librería como GLAD, la cual se encargará de buscar y cargar la API de OpenGL para nosotros. En esta web podemos descargar la versión de GLAD que necesitemos.

Para que se entienda mejor, sin GLAD tendríamos que buscar manualmente la dirección de memoria de los puntos de entrada que el fabricante ofrece para las funciones de OpenGL.

Y creedme, no queremos eso ಠ_ಠ.

🏭 Pipeline Gráfico

El pipeline gráfico no es más que la secuencia de fases por las que pasa la información en la GPU, desde que inicia el Draw Call (no exactamente, pero para simplificar) hasta que se renderiza por pantalla.

Pipeline Grafico

🗄️ Buffers

Cuando queremos dibujar un triángulo, enviamos un buffer con los datos de ese triángulo a la GPU.

Un buffer no es más que un array de bytes que contiene info como:

  • las posiciones de los vértices (x,y,z)
  • las coordenadas de las texturas (u,v)
  • normales
  • colores

En OpenGL existen muchas formas para enviar información a la GPU en las que intervienen diferentes funciones y estructuras, solo para que nos suene la notación:

  • glCreateBuffer
  • glBindBuffer
  • glBufferData
  • glBufferSubData
  • glMapBuffer …

✏️ Draw Call

Una vez esta información esta almacenada en la memoria de la GPU, podemos enviar un comando específico, generalmente conocido como ‘Draw Call’, que indica a la GPU que puede empezar a renderizar la información que tiene en su memoria.

📈 Bottlenecks

Un bottleneck o ‘cuello de botella’ en programación gráfica suele venir dado por un exceso de Draw Calls dentro de un mismo frame. La comunicación CPU-GPU + transferencia de datos de una pieza de hardware a otra es muy costosa. Por eso muchas optimizaciones en programación gráfica suelen basarse en reducir la información para enviar a la GPU y reducir el número de Draw Calls (idealmente a 1 por frame).

📃 Shaders

Un shader es un programa escrito en un lenguaje que la GPU puede comprender (o que se compila a algo que la GPU puede comprender) y se encarga de definir una lógica para una de las fases del Pipeline Gráfico. En Shader Toy podéis cacharrear con shaders✨

▶️ Explicación en YouTube

Dado que esta introducción es algo vaga, os dejo una explicación más interactiva que hice para YouTube tiempo atrás, espero que os sirva para asentar mejor todo esto ✌️💚

📄 Recursos

Para finalizar, os dejo una lista de mis recursos favoritos para iniciarse en OpenGL ⭐

🌐 Webs

▶️ YouTube

📚 Libros

  • Beginning OpenGL Game Programming
  • More OpenGL Game Prog.
  • OpenGL Insights