c++ - español - Comprender los objetos de matriz vértice(glGenVertexArrays)
opengl descargar (3)
Estoy confundido con el punto de generar / crear un objeto de matriz de vértices (VAO) con:
glGenVertexArrays(GLsizei n, GLuint *arrays);
y
glBindVertexArray(GLuint);
Porque aún puedo crear un objeto de memoria intermedia, digamos para vértices y describir ese objeto de memoria intermedia con glVertexAttribPointer
y glEnableVertexAttribArray
sin crear nunca un VAO.
Mi pregunta es si no tiene que crear realmente el VAO para describir los datos en un objeto de búfer, ¿por qué las fuentes como OpenGL SuperBible 5ed incluyen una llamada para crear un VAO al crear VBO? ¿Solo se usan para temas más avanzados que aún tengo que descubrir? ¿Estoy totalmente confundido?
También encontré esta pregunta por primera vez al leer entradas de wikipedias en VBO y su código de ejemplo no incluye llamadas a glGenVertexArrays()
pero aún describen los datos con glVertexAttribPointer()
. Entrada de Wiki VBO - Ejemplo donde se crean los VAO por qué razón?
Digamos que está construyendo un objeto que necesita tres VBO (diferentes datos para sombrear, tal vez posiciones, normales y algún parámetro de efecto de fantasía). Cada vez que dibuja este objeto, debe vincular todos estos VBO y establecer los parámetros adicionales. Si usa un VAO, solo debe usar una llamada (vinculando el conjunto de vértices), esto configurará todo el entorno para el objeto específico.
La respuesta no es tan difícil como imaginabas. Solo piense en ello como una metáfora divertida; VertexArrayObject
es el jefe y administra varios miembros del personal que son VetexBufferObjects
.
Mejoras de rendimiento
En muchos casos, la configuración de sus atributos en el host requiere una gran cantidad de llamadas API y una importante cantidad de validación dentro de la implementación.
Hacer todo eso una vez y usar el VAO permite que ese trabajo se amortice.
Ver, por ejemplo, el analysis Graham Sellers para datos reales.