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:
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:
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:
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:
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.
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:
- Gen und binden VAO
- Gen und bind IBO und BufferData
- Gen und bind VBO und BufferData
- EnableVertexAttribArrays, die ich brauche, und VertexAttribPointers festlegen
- VAO (Bindung an 0) aufheben
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.