Un VAO se souvient-il d’un EBO / IBO (éléments ou indices) et d’un VBO?

Mon code fonctionne comme il se doit mais c’est peut-être une coïncidence et je ne veux pas m’attarder plus tard sur un bogue, j’essaie donc de le garder le plus propre possible:

Je fais ce qui suit pour initialiser un maillage:

  1. Génération et liaison de données VBO et de mémoire tampon
  2. Génération et liaison des données IBO et de la mémoire tampon
  3. Gen et lier VAO
  4. Lier le même VBO que précédemment, généré dans 1.
  5. Activer les tableaux d’atsortingbuts de sumt dont j’ai besoin et définir les pointeurs d’atsortingbut de sumt
  6. Lier à nouveau l’IBO (ne sait pas exactement pourquoi)
  7. BindVertexArray retourne à 0 pour ne pas gâcher le VAO que je viens de créer

De ma compréhension, le VAO stockera l’état des tableaux d’atsortingbuts de sumt que j’ai activés. Il va également stocker à la fois le VBO et l’IBO que j’ai lié. Puisque j’ai “fermé” toutes les actions sur le VAO en liant le Vertex Array à 0, je m’assure qu’aucun autre code ne va gâcher mon VAO. Donc si tout va bien, tout ce que j’ai à rendre est:

  1. Lier VAO
  2. Dessiner des éléments
  3. Annuler la liaison VAO (liaison à 0)

Et cela devrait amener les états AtsortingbArray ainsi que le VBO et l’IBO stockés. Mes questions sont:

A. Dois-je lier l’IBO après avoir défini les VertexAtsortingbPointers? Si oui, pourquoi?

B. Le VAO stocke-t-il réellement le VBO et le PCI? J’ai entendu dire qu’il ne stockait que le dernier tampon lié, ce qui signifie que je dois effectuer le rendu comme ceci:

  1. Lier VAO
  2. Lier VBO
  3. Dessiner des éléments
  4. Dissocier VAO

Mais cela n’a aucun sens, pourquoi utiliser des VAO quand ils ne stockent pas les deux objects de tampon? Ne serait-ce pas la même chose que de lier VBO et IBO puis de dessiner des éléments sans jamais lier le VAO?

Merci d’avance pour votre aide.

Le code est le suivant:

Initialisation

// generate VBO glGenBuffers(1, &m_vbo); glBindBuffer(GL_ARRAY_BUFFER, m_vbo); glBufferData(GL_ARRAY_BUFFER, m_vertices.size()*sizeof(GLfloat), m_vertices.data(), GL_STATIC_DRAW); // generate IBO glGenBuffers(1, &m_ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size()*sizeof(unsigned short), m_indices.data(), GL_STATIC_DRAW); // generate VAO glGenVertexArrays(1, &m_vao); glBindVertexArray(m_vao); glBindBuffer(GL_ARRAY_BUFFER, m_vbo); // set the vertex atsortingbute pointer glEnableVertexAtsortingbArray(0); glVertexAtsortingbPointer(0,3,GL_FLOAT,GL_FALSE,vertexSize,reinterpret_cast(0)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); glBindVertexArray(0); 

Dessin

 glBindVertexArray(m_vao); glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,reinterpret_cast(0)); glBindVertexArray(0); 

Aussi, n’est-ce pas plus propre si je le mets comme ceci:

  1. Gen et lier VAO
  2. Générer et lier IBO et BufferData
  3. Générer et lier VBO et BufferData
  4. EnableVertexAtsortingbArrays dont j’ai besoin et définir VertexAtsortingbPointers
  5. Annuler la liaison VAO (liaison à 0)

Cela semble plus propre, mais je ne sais pas si le résultat est le même, en particulier en raison de l’absence de liaison IBO entre les étapes 4 et 5.

Répondre à vos questions:

A. Dois-je lier l’IBO après avoir défini les VertexAtsortingbPointers? Si oui, pourquoi?

Non. Vous pouvez commencer par lier le tableau d’éléments (IBO dans votre terminologie), puis créer les atsortingbuts de sumt plus tard, mais en règle générale, il s’agit de liaisons distinctes au sein de la VAO. Par exemple, vous pouvez lier votre IBO ainsi que plusieurs VBO et effectuer un rendu avec glDrawElements (et variantes) à l’aide des données de l’IBO ou avec glDrawArrays (et variantes) en utilisant uniquement les données de sumt séquentielles de vos VBO (commande de rendu). détermine si le PCI est utilisé ou non.

B. Le VAO stocke-t-il réellement le VBO et le PCI?

Oui. Un VAO peut stocker les informations de liaison pour un seul IBO et au moins 16 VBO.

J’ai entendu dire qu’il ne stockait que le dernier tampon lié, ce qui signifie que je dois effectuer le rendu comme ceci:

Lier VAO
Lier VBO
Dessiner des éléments
Dissocier VAO

Comme vous l’avez supposé dans votre message d’origine, cette déclaration est incorrecte et la liaison du VBO que vous incluez est inutile. Un VAO peut stocker le nombre maximal de VBO dépendant de la mise en œuvre (qui est au moins 16), chacun pouvant être lié à un atsortingbut de sumt.

Aussi, n’est-ce pas plus propre si je le mets comme ceci:

  1. Gen et lier VAO
  2. Générer et lier IBO et BufferData
  3. Générer et lier VBO et BufferData
  4. EnableVertexAtsortingbArrays dont j’ai besoin et définir VertexAtsortingbPointers
  5. Annuler la liaison VAO (liaison à 0)

Oui. Comme vous l’avez fait remarquer, cela vous permet de lier, de rendre et de nettoyer en seulement trois commandes.

En réalité, c’est tout l’intérêt des VAO: collecter toutes ces associations d’atsortingbuts de liaison et de sumt afin de pouvoir effectuer toute la plomberie une fois, puis de ne pas oublier plus tard.