Quel est le but des objets Vertex Array d'OpenGL?

36

Je viens juste de commencer avec OpenGL. Je n'ai toujours pas compris ce que sont les objets Vertex Array et comment les utiliser.

Si les objets Vertex Buffer sont utilisés pour stocker des données de sommet (telles que leurs positions et leurs coordonnées de texture) et que les VAO ne contiennent que des indicateurs d'état, où peuvent-ils être utilisés? Quel est leur but?

D'après ce que j'ai compris du GL Wiki (très incomplet et peu clair), les VAO sont utilisés pour définir les drapeaux / statūs pour chaque sommet, en respectant l'ordre décrit dans le tampon de tableaux, mais le wiki était vraiment ambigu à ce sujet et je ' Je ne sais pas vraiment ce que font les VAO ni comment je pourrais les employer.

Vaillancourt
la source

Réponses:

49

Je pense que vous comprendrez mieux leur objectif avec un échantillon. En lisant les commentaires, vous comprendrez comment les VAO sont utilisés.

// BEGIN INITIALIZATION
// Define some vertex data 
struct Vertex {
  GLfloat position[3];
  GLfloat texcoord[2];
};
Vertex vertexdata[NUM_VERTS] = { ... };
GLubyte indexdata[NUM_INDICES] = { 0, 1, 2, ... };

// Create and bind a VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create and bind a BO for vertex data
GLuint vbuffer;
glGenBuffers(1, &vbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vbuffer);

// copy data into the buffer object
glBufferData(GL_ARRAY_BUFFER, NUM_VERTS * sizeof(Vertex), vertexdata, GL_STATIC_DRAW);

// set up vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texcoord));

// Create and bind a BO for index data
GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

// copy data into the buffer object
glBufferData(GL_ELEMENT_ARRAY_BUFFER, NUM_INDICES * sizeof(GLubyte), indexdata, GL_STATIC_DRAW);

// At this point the VAO is set up with two vertex attributes
// referencing the same buffer object, and another buffer object
// as source for index data. We can now unbind the VAO, go do
// something else, and bind it again later when we want to render
// with it.

glBindVertexArray(0);

// END INITIALIZATION

// BEGIN RENDER LOOP

// This is it. Binding the VAO again restores all buffer 
// bindings and attribute settings that were previously set up
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, NUM_INDICES, GL_UNSIGNED_BYTE, (void*)0);

// END RENDER LOOP
Pombal
la source
2
Puis-je faire cela avec les données de tampon GL_DYNAMIC_DRAW aussi? La partie de rendu contiendrait-elle uniquement les fonctions glBindVertexArray (), glBufferData () puis glDrawElements ()?
Piku
Comment traitez-vous les normales dans cet exemple? Je veux dire que faire si vous ajoutez un GLfloat normal[3]dans votre classe de sommet et que vous voulez télécharger les normales au client?
linello
1

Les VAO sont utiles car vous n'avez pas besoin de configurer à chaque fois tous les attributs. Il devrait également être plus rapide. Il vous suffit de lier un ordinateur VAO plutôt que de définir tous les attributs.

zacharmarz
la source
1

Ceci est mon lien préféré: http://www.songho.ca/opengl/gl_vertexarray.html

Cela devrait vous aider à mieux comprendre les différences entre VAO et VBO. En outre, je vous recommande de lire un chapitre d'OpenGL superbible sur ce sujet. Il fait un bon travail pour expliquer ces bases en détail et avec des exemples.

brainydexter
la source
6
L'article que vous avez lié ne couvre pas les VAO, mais uniquement les tableaux de sommets (qui existent depuis un certain temps déjà). Je m'interroge moi-même sur les différences spécifiques entre ces deux-là.
Steven Lu
Il n'y a pas beaucoup de différence. Le VAO encapsule simplement tous les états concernant les tableaux de sommets, leurs utilisations et leurs formats, à l'exception des données de tableau elles-mêmes, qui sont stockées dans des VBO. Mais vous avez raison de dire que cette réponse (ou le lien) ne parle pas vraiment de VAO.
Chris dit Réintégrer Monica le