Erinnert sich ein VAO sowohl an einen EBO / IBO (Elemente oder Indizes) als auch an einen VBO?

8

Mein Code funktioniert so, wie er sollte, aber es könnte ein Zufall sein, und ich möchte später nicht auf einen Fehler eingehen, also versuche ich, ihn so sauber wie möglich zu halten:

Ich mache folgendes, um ein Mesh zu initialisieren:

  1. Gen und bind VBO und Pufferdaten
  2. Gen und binden Sie IBO und Pufferdaten
  3. Gen und bind VAO
  4. Binden Sie denselben VBO wie zuvor, generiert in 1.
  5. Aktivieren Sie die benötigten Vertex-Attribut-Arrays und legen Sie die Vertex-Attribut-Zeiger
  6. fest
  7. Binde den IBO erneut (weiß nicht genau warum)
  8. BindVertexArray zurück auf 0, damit ich den gerade erstellten VAO nicht durcheinander bringe

Nach meinem Verständnis speichert der VAO den Zustand der Vertex-Attribut-Arrays, die ich aktiviert habe. Es speichert auch sowohl den VBO als auch den IBO, den ich gebunden habe. Da ich alle Aktionen auf dem VAO "geschlossen" habe, indem ich das Vertex-Array an 0 gebunden habe, stelle ich sicher, dass kein anderer Code meinen VAO durcheinander bringt. Wenn alles in Ordnung ist, muss ich nur rendern:

  1. VAO binden
  2. Elemente zeichnen
  3. Entfessle VAO (Bindung an 0)

Dies sollte sowohl die AttribArray-Zustände als auch die gespeicherten VBO und IBO enthalten. Meine Fragen sind:

A. Muss ich den IBO binden, nachdem ich die VertexAttribPointers gesetzt habe? Wenn ja, warum?

B Speichern die VAO wirklich beide den VBO und den IBO? Ich habe gehört, es speichert nur den letzten Puffer, der gebunden war, was bedeutet, dass ich so rendern muss:

  1. VAO binden
  2. Bind VBO
  3. Elemente zeichnen
  4. VAO lockern

Aber das macht keinen Sinn, warum VAOs verwenden, wenn sie nicht beide Pufferobjekte speichern? Wäre es nicht genauso, VBO und IBO zu binden und dann Elemente zu zeichnen, ohne jemals den VAO zu binden?

Vielen Dank im Voraus für Ihre Hilfe.

Code ist wie folgt:

Initialisierung

%Vor%

Zeichnen

%Vor%

Ist es nicht auch sauberer, wenn ich es so formuliere:

  1. Gen und bind VAO
  2. Gen und bind IBO und BufferData
  3. Gen und bind VBO und BufferData
  4. EnableVertexAttribArrays, die ich brauche, und VertexAttribPointers
  5. festlegen
  6. Entfessle VAO (Bindung an 0)

Scheint sauberer zu sein, aber ich weiß nicht, ob das Ergebnis dasselbe ist, speziell wegen des Fehlens einer IBO-Bindung zwischen den Schritten 4 und 5.

    
Francisco Inácio 27.06.2013, 00:28
quelle

1 Antwort

5

Adressieren Sie Ihre Fragen:

  

A. Muss ich den IBO binden, nachdem ich die VertexAttribPointers gesetzt habe? Wenn ja, warum?

Nein. Sie könnten zuerst das Elementarray (IBO in Ihrer Terminologie) binden und später die Vertexattribute, aber im Allgemeinen sind sie separate Bindungen innerhalb des VAO. Sie könnten beispielsweise Ihren IBO sowie mehrere VBOs binden und entweder mit glDrawElements (und Varianten) mit den Daten im IBO oder mit glDrawArrays (und Varianten) nur die sequenziellen Vertexdaten in Ihren VBOs verwenden - Der Rendering-Befehl bestimmt, ob der IBO verwendet wird oder nicht.

  

B Speichern die VAO sowohl den VBO als auch den IBO wirklich?

Ja. Ein VAO kann die Bindungsinformationen für einen einzelnen IBO und mindestens 16 VBOs speichern.

  

Ich habe gehört, dass es nur den letzten Puffer speichert, der gebunden war, was bedeutet, dass ich so rendern muss:

     

Binden VAO
  Binden Sie VBO
  Zeichenelemente
  VAO freischalten

Wie Sie in Ihrem ursprünglichen Post vermutet haben, ist diese Aussage falsch, und die Bindung des von Ihnen eingeschlossenen VBO ist unnötig. Ein VAO kann die implementierungsabhängige maximale Anzahl (mindestens 16) von VBOs speichern, von denen jede an ein Vertex-Attribut gebunden werden kann.

  

Ist es nicht auch sauberer, wenn ich es so formuliere:

     
  1. Gen und binden VAO
  2.   
  3. Gen und bind IBO und BufferData
  4.   
  5. Gen und bind VBO und BufferData
  6.   
  7. EnableVertexAttribArrays, die ich brauche, und VertexAttribPointers festlegen
  8.   
  9. VAO (Bindung an 0) aufheben
  10.   

Ja. Wie Sie betonen, können Sie mit nur drei Befehlen binden, rendern und bereinigen.

Wirklich, das ist der ganze Sinn von VAOs, all diese Bindungs- und Vertexattributverknüpfungen zu sammeln, damit Sie einmal alle Klempnerarbeiten erledigen und später wieder feuern und vergessen können.

    
radical7 27.06.2013, 07:56
quelle

Tags und Links