Vertex Array Objects (openGL)
-
Hallo noch mal,
im Moment versuche ich an einem Beispiel nachzuvollziehen, wie das alles mit den OpenGL Objects funktioniert, zusammenhängt, etc.
Mir ist so eine Struktur immer wichtig, ohne bleibt das einfach nicht hängen. ;).Zum ersten gehe ich von folgendem aus und ich bitte darum, mich zu korrigieren:
1) Ein OpenGL Object ist nicht mehr als eine Sammlung von (bestimmten) Zuständen. Binde ich ein OpenGL Object an einen Kontext, dann ändern sich alle Zustände des Kontextes entsprechend der Zustände in dem Object. Ändere ich, mit gebundenem Object, Zustände des Kontextes, so ändern sich die Zustände in dem Object mit.
Entsprechend sind OpenGL Objects "Schablonen"?
Weiter glaube ich verstanden zu haben, dass folgendes gilt:
2) Manche OpenGL Funktionen bedürfen eines gebundenen OpenGL Objects; Für manche gibt es "Standard-Schablonen" ?
Nun habe ich hier folgenden Code-Ausschnitt aus einem Beispiel:
/* Mesh Daten innerhalb eines Vertex Arrays (in diesem Fall 4 Elemente) struct Vertex { position pos; colour col; } position, colour sind entsprechend auch structs mit GLfloats. */ // Erstellen und binden des VAO: glGenVertexArrays(1, &vertexArrayObject); glBindVertexArray(vertexArrayObject); // Buffer Object für Mesh Daten: glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(Vertex), vertexData, GL_STATIC_DRAW); glEnableVertexAttribArray((GLuint)positionAttribute); glVertexAttribPointer((GLuint)positionAttribute, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)offsetof(Vertex, position)); glEnableVertexAttribArray((GLuint)colourAttribute ); glVertexAttribPointer((GLuint)colourAttribute , 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)offsetof(Vertex, colour ));
Hierin befinden sich zwei Objects:
- VAO vertexArrayObject
- BO vertexBufferDiesbezüglich meine ich verstanden zu haben:
3) Ein VAO ist eine Schablone für bestimmte Zustände von Vertex Attributes, also von meinen "in" Variablen in meinen shader-programmen. Gerade solche Zustände, welche mit dem binden externer Vertex-Daten zusammenhängen.
In dem Beispiel werden also bei speziell zwei vertex Attributes (positionAttribute und colourAttribute) Zustände verändert:
vertexArrayObject: positionAttribute: enabled = true bufferSize/Offset/Stripe (via glVertexAttribPointer) colourAttribute: enabled = true bufferSize/Offset/Stripe (via glVertexAttribPointer)
Eine Vermutung hier:
4) Auch der Buffer wird mit eingetragen in die Zustände, da ich zuvor jenen gebunden habe.
-----------------------
Uhm, doch etwas mehr geworden; ich hoffe, dass das niemanden abschreckt. (Nicht mehr als mein Hang zum Semikolon; an ggf. willkürlicher Stelle.)
Insofern hoffe ich zudem, dass jemand trotzdem die Geduld aufbringt.Lieben Gruß,
ghub
-
Bin mir nicht sicher was genau die Frage ist, aber ich hab den Eindruck dass du's vermutlich richtig verstanden hast...
-
Genau darum ging es mir.
Denn ich bin mir nicht sicher, ob es sich so verhält, wie ich es verstanden habe (und oben beschrieben habe).
Wenn gegen oben nichts einzuwenden ist, dann ist für mich alles beantwortet!Vielen Dank!