Un objeto de matriz de vértices (VAO) es un objeto OpenGL. Sin embargo, a diferencia de un Buffer Objects que contiene almacenamiento, un VAO no lo hace. En cambio, un VAO es un contenedor para objetos Vertex Buffer (VBO).
¿Por qué usar un VAO?
Supongamos que necesita representar 12 caracteres diferentes, cada uno con su propio tipo de datos, desplazamiento, etc. Toda esta información debe prepararse antes de que se represente. Estos son muchos estados para configurar y muchos errores de comprobación que el controlador tendrá que hacer.
Aquí es donde un VAO puede ayudar a organizar toda esta información. Un VAO es un contenedor que almacena todos los estados necesarios para la representación. Almacena la información de vértice-atributo, así como el objeto de búfer.
- ¿Cómo se diseñaría una estructura de datos para soportar las siguientes operaciones en tiempo logarítmico: insert, deleteMin, deleteMax findMin, findMax?
- ¿Cuál es la técnica / algoritmo utilizado por mensajeros como WhatsApp y BBM para comprimir imágenes?
- ¿Cuál es el mejor algoritmo de aprendizaje automático sin supervisión para la segmentación de imágenes basada en color?
- ¿Cuáles son los algoritmos de búsqueda paralelos más importantes? ¿Qué ventajas tienen sobre los algoritmos de búsqueda clásicos?
- ¿Podría alguien explicar las etapas de un algoritmo recursivo que muestra cómo se alcanza la condición de terminación?
Ahora, si recuerda, antes de que se pueda usar un Objeto OpenGL, primero debe crearse y vincularse. Por lo tanto, antes de poder usar un VAO, debe crearlo y vincularlo al contexto OpenGL.
Usar un objeto de matriz de vértices es bastante simple. Creamos y vinculamos un VAO antes de la creación de un búfer OpenGL.
Aquí he resumido los 11 pasos necesarios para renderizar en OpenGL:
- Generar un VAO ( glGenVertexArrays ): Informa a OpenGL para crear un VAO.
- Vincula el VAO ( glBindVertexArray ): Informa a OpenGL para vincular un VAO.
- Generar un VBO ( glGenBuffers () ): Informa a OpenGL para crear un Buffer.
- Vincula el VBO ( glBindBuffer () ): Informa a OpenGL para usar este búfer para operaciones posteriores.
- Datos del búfer ( glBufferData () o glBufferSubData () ): Informa a OpenGL para asignar e inicializar suficiente memoria para el búfer actualmente vinculado.
- Obtener ubicación de atributos ( glGetAttribLocation () ): obtiene la ubicación de los atributos en el sombreador activo actual.
- Obtener la ubicación del uniforme ( glGetUniformLocation () ): obtener la ubicación de los uniformes en el sombreador activo correcto.
- Enable ( glEnableVertexAttribArray () ): habilita las ubicaciones de atributos que se encuentran en el sombreador.
- Establecer punteros ( glVertexAttribPointer () ): Informa a OpenGL sobre los tipos de datos en buffers vinculados y cualquier compensación de memoria necesaria para acceder a los datos.
- Draw ( glDrawArrays () o glDrawElements () ): Informa a OpenGL para representar una escena utilizando datos en buffers actualmente vinculados y habilitados.
- Eliminar ( glDeleteBuffers () ): dígale a OpenGL que elimine los búferes generados previamente y los recursos asociados gratuitos.
La preparación de un búfer con un VAO se realiza simplemente como se muestra arriba. Antes de crear un VBO, creamos y vinculamos un VAO (pasos 1-2).