DEV Community

Cover image for Entendiendo VAO y VBO desde C/C++
Exequiel Pagliari
Exequiel Pagliari

Posted on

Entendiendo VAO y VBO desde C/C++

Uno de los temas que más me cuestan de OpenGL está muy relacionado con conceptos de manejo de memoria y tipos de datos de C/C++. La complejidad surge, en parte, porque existen dos recursos estrechamente relacionados dentro del proceso de carga y consumo de datos por parte de la GPU: VAO y VBO.

VAO son las siglas de Vertex Array Object. Un VAO no almacena los datos de los vértices. Su función es describir cómo deben interpretarse los datos almacenados en los buffers. En otras palabras, expresa la disposición, los offsets y los tamaños de los atributos almacenados dentro de un buffer que posteriormente serán procesados por la GPU.

VBO son las siglas de Vertex Buffer Object. Un VBO es un recurso utilizado para almacenar los datos crudos de los vértices de una malla en memoria gestionada por OpenGL.

Por este motivo, la representación de una malla en OpenGL requiere tanto los datos almacenados en memoria como la descripción de cómo dichos datos deben interpretarse para ser procesados por la GPU.

Haciendo una analogía con C/C++, un VBO puede compararse conceptualmente con una reserva de memoria dinámica. Del mismo modo que malloc() permite reservar memoria para almacenar datos, un VBO permite almacenar información que posteriormente será consumida por la GPU.

void* memory = malloc(size);
Enter fullscreen mode Exit fullscreen mode

Siguiendo esta línea, un VAO cumple un rol similar a la información que el compilador obtiene a partir de una estructura (struct).

En el caso de una figura 3D, cada vértice puede componerse de tres valores flotantes, uno por cada eje:

struct Vertex
{
    float x;
    float y;
    float z;
};
Enter fullscreen mode Exit fullscreen mode

Dado que un float ocupa 4 bytes, una instancia de Vertex ocupa 12 bytes en memoria.

Esta información debe configurarse mediante los atributos almacenados en el VAO para que OpenGL sepa que cada vértice ocupa 12 bytes y pueda recorrer el buffer agrupando correctamente los datos. De esta forma existe coherencia entre la disposición real de los datos en memoria y la forma en que la GPU los interpreta durante el renderizado.

Fuentes y referencias

Atribución de imagen

Imagen de portada obtenida de LearnOpenGL:
https://learnopengl.com/Getting-started/Hello-Triangle

Top comments (0)