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:
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:
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:
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:
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:
- Gen et lier VAO
- Générer et lier IBO et BufferData
- Générer et lier VBO et BufferData
- EnableVertexAtsortingbArrays dont j’ai besoin et définir VertexAtsortingbPointers
- 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.