Sur tous les tutoriels que je peux trouver sur les objets VAO (Vertex Array Objects), ils montrent comment les utiliser en configurant les attributs de vertex et en liant un VBO (Vertex Buffer Object). Mais je veux créer un VAO qui sera configuré pour un ensemble de VBO en combinaison avec un shader fixe, où chaque tampon utilise le même modèle de données (vertex, uv, color, etc.). Donc, je veux créer un VAO pour plusieurs VBO qui seront dessinés en utilisant un shader.
Je n'ai trouvé aucune démo à ce sujet, j'ai donc décidé de l'essayer. Mais cela ne fonctionne pas et se bloque à l' glDrawArray
appel. Il semble que le VBO ne soit pas lié. Voici le code que j'utilise:
Le rendu:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
Création VAO:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Où ls
est un simple struct
qui contient les emplacements des attributs.
Dans la partie Rendu, l'échange de glBindBuffer
et glBindVertexArrayOES
autour n'a pas fonctionné non plus.
Donc, la question est: est-il même possible de le faire, ou devrai-je créer pour chaque tampon un VAO? Et si je dois créer un VAO pour chaque VBO, est-il possible de mettre à jour les données du VBO en utilisant glBufferSubData
en combinaison avec un VAO?
Le VAO stocke l'état glVertexAttribPointer. Changer le VAO n'affecte pas le glBindBuffer actuel, ni changer le glBindBuffer n'affecte le VAO. Seul l'appel glVertexAttribPointer affecte le VAO, en enregistrant le tampon utilisé lors de l'appel.
La réponse à votre question est donc non.
Une option si vous souhaitez réduire le nombre d'objets consiste à placer toutes vos données de maillage dans un grand VBO et à spécifier où les données de maillage résident dans le VBO dans l'appel glDrawArrays en utilisant les arguments `` premier '' et `` nombre ''.
la source
glBindBuffer
état saufGL_ELEMENT_ARRAY_BUFFER
est modifié en liant un VAO.