2017-09-09 11 views
2

J'ai un problème de compréhension de l'association entre VAO et le tampon lié à GL_ELEMENT_ARRAY_BUFFER (appelons-le EBO). Je dois savoir qu'il fait partie de l'état VAO, mais diffère des tampons utilisés avec les appels glVertexAttribPointer (ces tampons sont simplement mémorisés par VAO comme stockage d'attributs omettant de les lier - si j'ai bien compris).
Dans this discussion, il est affirmé:Association VAO et GL_ELEMENT_ARRAY_BUFFER

Contrairement GL_ARRAY_BUFFER, un magasin de VAO le courant de liaison pour GL_ELEMENT_ARRAY_BUFFER. L'appel de glBindBuffer (GL_ELEMENT_ARRAY_BUFFER) stocke une référence au tampon spécifié dans l'objet VAO lié. glDrawElements() etc prend les indices de vertex du buffer stocké dans le VAO actuellement lié. Ainsi, la commutation entre les VAO bascule entre les tableaux d'éléments.

Mais dois-je appeler glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) entre lier et délier de VAO pour vous assurer qu'il va « sauver » dans son état ou VAO prendra juste EBO actuellement lié quand VAO est créé?
La réponse citée ci-dessus ne me dit pas si VAO sait juste (en tant que tampons de stockage d'attributs) quels indices de tampons (glDrawElements) doivent être pris ou VAO lie-t-il le bon EBO quand VAO est lié?

modifier: La première de mes questions a été répondue here, cependant je crois que le deuxième a été répondu par @ Rabbid76.

+0

Copie possible de [objets VAO et éléments de tampon d'élément] (https://stackoverflow.com/questions/33863426/vaos-and-element-buffer-objects) –

Répondre

2

Dois-je appeler glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) entre bind et unbind de VAO?

Le OpenGL specification (chapter 10.3. VERTEX ARRAYS) dit clairement:

Un objet tableau de sommet est créé par la liaison d'un nom retourné par GenVertexArrays avec la commande
void BindVertexArray(uint array);array est le nom d'objet de tableau de vertex.
L'objet tableau de vertex résultant est un nouveau vecteur d'état , comprenant tout l'état et avec les mêmes valeurs initiales que celles indiquées dans les tableaux 23.3 et 23.4.
BindVertexArray peut également être utilisé pour lier un objet tableau de vertex existant. Si la liaison est réussie, aucune modification n'est apportée à l'état de l'objet tableau de sommets liés , et toute liaison précédente est rompue.

Les tableaux 23.3 et 23.4 contiennent ELEMENT_ARRAY_BUFFER_BINDING.

Cela signifie que le GL_ELEMENT_ARRAY_BUFFER doit être lié après l'objet de réseau de sommet a été consolidé (glBindVertexArray).
L'objet GL_ELEMENT_ARRAY_BUFFER est stocké dans le vecteur d'état des objets Array de vertex.
Si l'objet tableau de vertex a été non lié et est à nouveau lié, le GL_ELEMENT_ARRAY_BUFFER est également connu et lié.

+0

"Si l'objet tableau de vertex a été détaché et est à nouveau lié , puis le 'GL_ELEMENT_ARRAY_BUFFER' est connu et lié à nouveau, aussi." Et après la déconnexion du VAO, le tampon de rebonds OpenGL qui était lié à 'GL_ELEMENT_ARRAY_BUFFER' avant de lier le VAO ou le tampon du VAO est toujours lié à cette cible? – Criss

+0

@Criss 'glBufferData' crée un nouveau magasin de données pour un objet tampon. 'glBufferData' supprime tout magasin de données existant et définit les valeurs des variables d'état de l'objet tampon. Cela signifie que les données sont associées à l'objet tampon jusqu'à ce que vous ayez associé de nouvelles données. - voir [page de référence 'glBufferData' de Khronos] (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferData.xhtml) et [spécification OpenGL chapitre 6.2] (https: //www.khronos .org/registre/OpenGL/specs/gl/glspec46.core.pdf) – Rabbid76

1

Si vous configurez les choses correctement, au moment du tirage, vous ne devez lier que des VAO. C'est en quelque sorte le point entier, évitez les frais généraux du processeur d'appeler dans le pilote GL à plusieurs reprises pour chaque morceau de géométrie.

Lors de votre configuration initiale, vous devez créer et lier un objet VAO, puis lier tous les tampons d'attributs et les décrire avec glVertexAttribPointer, les activer avec glEnableVertexAttribArray et enfin lier le GL_ELEMENT_ARRAY_BUFFER. Après cela, je lierais le VAO à null afin de ne pas lier accidentellement quelque chose d'autre dans les lignes suivantes.

(Notez que le glBindBuffer du tampon d'attribut lui-même est pas directement enregistré dans le VAO, mais inféré sur le site d'appel de glVertexAttribPointer. Autrement dit, tout ce qui est actuellement lié à GL_ARRAY_BUFFER lorsque vous appelez glVertexAttribPointer sera ce que le VAO sources pour l'extraction de vertex.)

Au cours de votre boucle de rendu, vous devez lier les différents objets VAO que vous avez créés précédemment. C'est un peu déroutant car dans la pratique, parfois, un VAO est lié à "Je veux commencer à enregistrer une petite macro" (au moment de l'installation initiale) et parfois un VAO signifie "Je veux que vous reproduisiez toutes les liaisons cette macro que j'ai enregistrée précédemment "(au moment du rendu). Il est décrit dans le RFC original:

The currently bound vertex array object is used for all commands 
which modify vertex array state, such as VertexAttribPointer and 
EnableVertexAttribArray; all commands which draw from vertex arrays, 
such as DrawArrays and DrawElements; and all queries of vertex 
array state. 

https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_vertex_array_object.txt

Voir aussi les tableaux 6.4 et 6.5 de la norme GL pour voir exactement quels champs sont stockés dans le struct VAO:

https://www.khronos.org/registry/OpenGL/specs/gl/glspec32.core.pdf