Je commence tout juste à apprendre OpenGL aujourd'hui à partir de ce tutoriel: http://openglbook.com/the-book/
Je suis arrivé au chapitre 2, où je dessine un triangle, et je comprends tout sauf les VAO (cet acronyme est-il correct?). Le tutoriel a ce code:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Bien que je comprenne que le code est nécessaire, je n'ai aucune idée de ce qu'il fait. Bien que je n'utilise jamais VaoId au-delà de ce point (sauf pour le détruire), le code ne fonctionne pas sans lui. Je suppose que c'est parce qu'il est nécessaire d'être lié, mais je ne sais pas pourquoi. Ce code exact doit-il simplement faire partie de chaque programme OpenGL? Le didacticiel explique les VAO comme suit:
Un objet Vertex Array (ou VAO) est un objet qui décrit comment les attributs de vertex sont stockés dans un objet Vertex Buffer (ou VBO). Cela signifie que le VAO n'est pas l'objet réel stockant les données de sommet, mais le descripteur des données de sommet. Les attributs Vertex peuvent être décrits par la fonction glVertexAttribPointer et ses deux fonctions soeurs glVertexAttribIPointer et glVertexAttribLPointer, la première que nous explorerons ci-dessous.
Je ne comprends pas comment le VAO décrit les attributs de vertex. Je ne les ai décrits d’aucune façon. Obtient-il les informations du glVertexAttribPointer? Je suppose que ça doit être ça. Le VAO est-il simplement une destination pour les informations de glVertexAttribPointer?
En passant, le tutoriel que je suis est-il acceptable? Y a-t-il quelque chose à surveiller ou un meilleur tutoriel à suivre?
la source
glVertexAttribPointer
VertexArrayMacro
ou quelque chose de similaire.Les objets Vertex Array sont comme des macros dans les programmes de traitement de texte, etc. Une bonne description se trouve ici .
Les macros se souviennent simplement des actions que vous avez effectuées, telles que activer cet attribut, lier ce tampon, etc. Lorsque vous appelez
glBindVertexArray( yourVAOId )
, il relit simplement ces liaisons de pointeur d'attribut et de tampon.Ainsi, votre prochain appel à dessiner utilise ce qui était lié par le VAO.
Les VAO ne stockent pas les données de sommet . Non. Les données de vertex sont stockées dans un tampon de vertex ou dans un tableau de mémoire client.
la source
Je considère toujours VAO comme un tableau de tampons de données utilisés par OpenGL. En utilisant OpenGL moderne, vous allez créer des objets VAO et Vertex Buffer.
L'étape suivante consiste à lier les données à un tampon:
À ce stade, OpenGL voit:
Nous pouvons maintenant utiliser glVertexAttribPointer pour indiquer à OpenGL ce que représentent les données du tampon:
OpenGL a maintenant les données dans le tampon et sait comment les données sont organisées en sommets. Le même processus peut être appliqué aux coordonnées de texture, etc., mais pour les coordonnées de texture, il y aurait deux valeurs.
Ensuite, vous pouvez lier la texture et dessiner des tableaux, vous voudrez créer un shader Vert et Frag, le compiler et le joindre à un programme (non inclus ici).
la source
VAO est un objet qui représente l'étape d'extraction de vertex du pipeline OpenGL et est utilisé pour fournir une entrée au nuanceur de vertex.
Vous pouvez créer un objet de tableau de sommets comme celui-ci
Commençons par faire un exemple simple. Considérez un tel paramètre d'entrée dans un code de shader
Pour remplir cet attribut, nous pouvons utiliser
Bien que l'objet tableau de sommets stocke ces valeurs d'attributs statiques pour vous, il peut faire beaucoup plus.
Après avoir créé un objet de tableau de sommets, nous pouvons commencer à remplir son état. Nous demanderons à OpenGL de le remplir automatiquement en utilisant les données stockées dans un objet tampon que nous fournissons. Chaque attribut de sommet récupère des données à partir d'un tampon lié à l'une des nombreuses liaisons de tampon de sommet. Pour cela, nous utilisons
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Nous utilisons également laglVertexArrayVertexBuffer()
fonction pour lier un tampon à l'une des liaisons de tampon de vertex. Nous utilisons laglVertexArrayAttribFormat()
fonction pour décrire la mise en page et le format des données, et enfin nous activons le remplissage automatique de l'attribut en appelantglEnableVertexAttribArray()
.Lorsqu'un attribut de sommet est activé, OpenGL fournira des données au shader de sommet en fonction du format et des informations d'emplacement que vous avez fournis avec
glVertexArrayVertexBuffer()
etglVertexArrayAttribFormat()
. Lorsque l'attribut est désactivé, le vertex shader recevra les informations statiques que vous fournissez lors d'un appelglVertexAttrib*()
.Et coder dans un shader
Après tout, vous devez appeler
glDeleteVertexArrays(1, &vao)
.Vous pouvez lire OpenGL SuperBible pour mieux le comprendre.
la source