Ich fange gerade erst an, OpenGL aus diesem Tutorial zu lernen: http://openglbook.com/the-book/
Ich komme zu Kapitel 2, wo ich ein Dreieck zeichne, und ich verstehe alles außer VAOs (ist dieses Akronym in Ordnung?). Das Tutorial hat diesen Code:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Obwohl ich verstehe, dass der Code notwendig ist, habe ich keine Ahnung, was er tut. Obwohl ich VaoId nach diesem Punkt nie mehr benutze (außer um es zu zerstören), funktioniert der Code ohne ihn nicht. Ich gehe davon aus, dass dies daran liegt, dass es gebunden werden muss, aber ich weiß nicht warum. Muss dieser genaue Code nur Teil jedes OpenGL-Programms sein? Das Tutorial erklärt VAOs wie folgt:
Ein Vertex-Array-Objekt (oder VAO) ist ein Objekt, das beschreibt, wie die Vertex-Attribute in einem Vertex-Pufferobjekt (oder VBO) gespeichert werden. Dies bedeutet, dass der VAO nicht das eigentliche Objekt ist, in dem die Scheitelpunktdaten gespeichert sind, sondern der Deskriptor der Scheitelpunktdaten. Vertex-Attribute können durch die Funktion glVertexAttribPointer und ihre beiden Schwesterfunktionen glVertexAttribIPointer und glVertexAttribLPointer beschrieben werden, von denen die erste im Folgenden untersucht wird.
Ich verstehe nicht, wie die VAO die Scheitelpunktattribute beschreibt. Ich habe sie in keiner Weise beschrieben. Erhält es die Informationen vom glVertexAttribPointer? Ich denke das muss es sein. Ist die VAO lediglich ein Ziel für die Informationen von glVertexAttribPointer?
Ist das Tutorial, dem ich folge, akzeptabel? Gibt es etwas, auf das ich achten sollte, oder ein besseres Tutorial, dem ich folgen kann?
quelle
glVertexAttribPointer
VertexArrayMacro
oder ähnliches.Vertex-Array-Objekte sind wie Makros in Textverarbeitungsprogrammen und dergleichen. Eine gute Beschreibung finden Sie hier .
Makros nur daran erinnern , die Aktionen , die Sie haben, wie activate dieses Attribut, binden diesen Puffer, usw. Wenn Sie anrufen
glBindVertexArray( yourVAOId )
, es ist einfach Replays diese Attribut Zeiger Bindungen und Bindungen puffern.Ihr nächster Aufruf zum Zeichnen verwendet also alles, was von der VAO gebunden wurde.
VAOs speichern keine Scheitelpunktdaten . Nein , die Eckendaten in einem Scheitelpunkt gespeichert Puffern oder in einer Reihe von Client - Speicher.
quelle
Ich denke immer an VAO als ein Array von Datenpuffern, die von OpenGL verwendet werden. Mit modernem OpenGL erstellen Sie VAO- und Vertex-Pufferobjekte.
Der nächste Schritt besteht darin, Daten an einen Puffer zu binden:
An diesem Punkt sieht OpenGL:
Jetzt können wir glGertexAttribPointer verwenden, um OpenGL mitzuteilen, was die Daten im Puffer darstellen:
OpenGL hat jetzt die Daten im Puffer und weiß, wie die Daten in Eckpunkten organisiert sind. Der gleiche Prozess kann auf Texturkoordinaten usw. angewendet werden, aber für Texturkoordinaten gibt es zwei Werte.
Als nächstes können Sie Texturen binden und Arrays zeichnen. Sie möchten einen Vert- und Frag-Shader erstellen, kompilieren und an ein Programm anhängen (hier nicht enthalten).
quelle
VAO ist ein Objekt, das die Vertex-Abrufphase der OpenGL-Pipeline darstellt und zur Bereitstellung von Eingaben für den Vertex-Shader verwendet wird.
Sie können ein Vertex-Array-Objekt wie folgt erstellen
Lassen Sie uns zuerst ein einfaches Beispiel machen. Betrachten Sie einen solchen Eingabeparameter in einem Shader-Code
Um dieses Attribut auszufüllen, können wir verwenden
Obwohl das Vertex-Array-Objekt diese statischen Attributwerte für Sie speichert, kann es viel mehr.
Nach dem Erstellen des Vertex-Array-Objekts können wir beginnen, seinen Status auszufüllen. Wir werden OpenGL bitten, es automatisch mit den Daten zu füllen, die in einem von uns bereitgestellten Pufferobjekt gespeichert sind. Jedes Vertex-Attribut kann Daten aus einem Puffer abrufen, der an eine von mehreren Vertex-Pufferbindungen gebunden ist. Zu diesem Zweck verwenden wir
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Wir verwenden dieglVertexArrayVertexBuffer()
Funktion auch, um einen Puffer an eine der Vertex-Pufferbindungen zu binden. Wir verwenden dieglVertexArrayAttribFormat()
Funktion, um das Layout und Format der Daten zu beschreiben, und schließlich ermöglichen wir das automatische Ausfüllen des Attributs durch AufrufenglEnableVertexAttribArray()
.Wenn ein Vertex-Attribut aktiviert ist, gibt OpenGL dem Vertex-Shader Daten basierend auf den Format- und Standortinformationen, die Sie mit
glVertexArrayVertexBuffer()
und angegeben haben, zuglVertexArrayAttribFormat()
. Wenn das Attribut deaktiviert ist, erhält der Vertex-Shader die statischen Informationen, die Sie bei einem Aufruf angebenglVertexAttrib*()
.Und Code in einem Shader
Immerhin müssen Sie anrufen
glDeleteVertexArrays(1, &vao)
.Sie können OpenGL SuperBible lesen , um es besser zu verstehen.
quelle