OpenGL-Wie Viele VAOs

Schreibe ich ein OpenGL3+ - Anwendung, und haben eine gewisse Verwirrung über die Verwendung von VAOs. Jetzt habe ich nur einen VAO, ein normierter quad set um den Ursprung. Diese single VAO enthält 3 VBOs; für Positionen, eine für Oberflächen-normalen, und man GL_ELEMENT_ARRAY_BUFFER für die Indizierung (so kann ich laden, nur 4 vertices, anstatt 6).

Habe ich einige helper-Methoden zum zeichnen von Objekten in der Szene, wie drawCube() welche position nimmt die rotation und Werte und folgt den Verfahren;

  • Binden die quad-VAO.
  • Pro cube Gesicht:
    • Erstellen Sie eine Modell-matrix, repräsentiert dieses Gesicht.
    • Laden Sie die Modell-matrix zu den uniform mat4 model vertex-shader-variable.
    • Nennen glDrawElements() zu ziehen mit dem quad in die position für das Gesicht.

Ich habe nur die Aufgabe, das hinzufügen von pro-cube-Farben und erkannte, dass ich kann nicht meine Farbe VBO zu den einzelnen VAO, wie es wird sich ändern mit jedem Würfel, und das fühlt sich nicht richtig an.

Ich habe gerade gelesen, die Frage; OpenGL VAO best practices, die mir sagt, dass mein Ansatz falsch ist, und dass ich verwenden soll, mehr VAOs, um die Arbeit sparen, die Einstellung die ganze Szene jedes mal.

Wie viele VAOs sollte verwendet werden? Klar mein Ansatz: 1 ist nicht optimal, sollte es einen VAO für jede statische Oberfläche in der Szene? Was diejenigen, die sich bewegen?

Ich Schreibe, um eine einheitliche variable für jeden vertex, ist das richtig? Ich habe gelesen, dass uniform shader-Variablen nicht ändern sollte mid-frame, wenn ich in der Lage bin zu schreiben, andere Werte zu meinem uniform variable, wie Uniformen unterscheiden sich von einfachen in Variablen im vertex-shader?

  • Ein VAO enthält keine VBO. Das ist eine häufige Fehleinschätzung, wie VAOs arbeiten und was Ihre zustandsvektors tatsächlich enthält. Sie können vollständig zu initialisieren einer VAO ohne VBO jemals gebunden. Es wird nicht lassen Sie Sie schieben einen einzelnen Scheitelpunkt entlang der pipeline, aber es ist möglich. That being said, die Terminologie "VBO" ist zweideutig in Ihrem Fall. Normalerweise beziehen Sie sich auf Puffer-Objekt mit Bindung an GL_ARRAY_BUFFER als VBO. Z-buffer-Objekt eine andere Semantik als ein Puffer-Objekt gebunden GL_ELEMENT_ARRAY_BUFFER. Letztere Bindung ist eigentlich VAO Zustand. Jedoch, Sie sind beide einfach nur noch buffer-Objekte.
  • "Ich Schreibe, um eine einheitliche variable für jeden vertex, ist das richtig?" Das ist nicht nur falsch, es ist nicht möglich. Entweder du verwechselst deine Bedingungen, oder du tust etwas, was Sie nicht erkennen, Sie tun.
  • Ich bin interleaving Aufrufe glDrawElements mit anrufen zu glUniformMatrix4 gleichzeitig zu ziehen VAO an verschiedenen Positionen, durch die Aktualisierung der Modell-matrix, erklärt, wie uniform mat4 model. Ich kann nur annehmen, dass dies so funktioniert, wie meine Würfel erscheinen in den zu erwartenden Positionen und keine andere Verwendung dieser Positionen vorgenommen wird.
  • danke, ich fühlte, dass die ELEMENT-Puffer war anders, aber wusste nicht, es war falsch, zu beziehen ist als ein VBO. Soll ich mich mit einer VAO für jedes polygon in meiner Welt? Oder man VAO für alle Oberflächen, die die gleiche textur, etc... ich versuche, herauszufinden, was Granularität VAOs sollte verwendet werden.
  • Was Nicol Bolas sagt, ist, dass Sie nicht ändern Sie den Wert einer uniform-variable für jeden vertex eingereicht von einem einzigen draw call. Ändern kann man die Uniformen nur zwischen zeichnen Sie Anrufe, aber nie für jeden vertex, es sei denn, Sie ein draw-Aufruf für jedes vertex, das wäre dumm, im Allgemeinen und würde auch nicht für jeden primitiven Typ als PUNKTE.
  • Eine uniform ist buchstäblich uniform, Sie es einmal pro Programm, und es wird einheitlich über alle vertex/primitive/fragment einen bestimmten shader-stage-Prozesse.

InformationsquelleAutor lynks | 2013-08-28
Schreibe einen Kommentar