Comprendre les objets de Vertex Array (glGenVertexArrays ))
je suis confondu avec le point d'en générer/créer un Sommet Objet Array (VAO) avec:
glGenVertexArrays(GLsizei n, GLuint *arrays);
et
glBindVertexArray(GLuint);
parce que je peux encore créer un objet buffer, disons pour les sommets, et décrire cet objet buffer avec glVertexAttribPointer
et glEnableVertexAttribArray
sans jamais créer un VAO.
ma question Est si vous ne devez pas réellement créer le VAO pour décrire les données dans un objet buffer, pourquoi des sources telles que L'OpenGL SuperBible 5ed incluraient un appel à créer un VAO lors de la création de VBOs? Ils sont uniquement utilisés pour des sujets plus avancés, j'ai encore à découvrir, je suis totalement confus?
J'ai aussi rencontré cette question pour la première fois en lisant l'entrée de wikipedias sur les VBOs et leur code d'exemple inclut aucun appel à glGenVertexArrays()
mais ils décrivent toujours les données avec glVertexAttribPointer()
.Wiki VBO entry --
exemple où des VAOs sont créés pour quelle raison?
3 réponses
amélioration des performances.
dans de nombreux cas, configurer vos attributs sur le host nécessite un nombre élevé d'appels API, et une quantité importante de validation à l'intérieur de l'implémentation.
faire tout cela une fois, et en utilisant le VAO permettent que le travail soit amorti.
voir, par exemple, Graham Sellers' analyse pour les données réelles.
supposons que vous construisez un objet qui nécessite trois VBO (différentes données pour l'ombrage, peut-être des positions, des normales et quelques paramètres d'effet fantaisistes). Chaque fois que vous dessinez cet objet, vous devez lier tous ces VBO et définir des paramètres supplémentaires. Si vous utilisez un VAO, vous n'avez qu'à utiliser un seul appel (liant le tableau de vertex), cela va configurer l'environnement entier pour l'objet spécifique.
la réponse n'est pas aussi difficile que vous l'imaginiez. Il suffit de penser à elle comme une métaphore Drôle;VertexArrayObject
est le patron et il gère plusieurs membres du personnel qui sont VetexBufferObjects
.