Wie interagiert re-glBufferData () mit glVertexAttribPointer?
Ich verstehe die grundlegende Reihenfolge: glGenBuffers () erstellt einen "Pufferobjektnamen", glBindBuffer () erstellt das eigentliche Pufferobjekt (sowie das Binden des Namens), glBufferData () "erstellt und initialisiert den Datenspeicher eines Pufferobjekts" und glVertexAttribPointer () legt das Format der Pufferdaten fest und speichert die Pufferobjektbindung als Teil des Vertex-Attribut-Array-Status.
Das Knifflige, dessen ich mir nicht sicher bin, ist, ob das Zeug glVertexAttribPointer () gültig bleibt, wenn der "Pufferobjekt-Datenspeicher" (aber nicht das Pufferobjekt selbst) durch einen neuen Aufruf von glBufferData () weggeblasen wird. Ich bin mir bewusst, dass dies normalerweise keine gute Idee ist - verwenden Sie glBufferSubData (), wenn Sie nur Puffer neu schreiben -, aber glBufferData () scheint die einzige Option zu sein, wenn die Größe geändert werden muss. Außerdem bin ich nur neugierig.
Auf den Referenzseiten klingt es so, als könnte es in beide Richtungen gehen - insbesondere (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml):
Wenn der Zeiger nicht NULL ist, muss ein Pufferobjekt ungleich Null an das Ziel GL_ARRAY_BUFFER gebunden werden (siehe glBindBuffer ), andernfalls wird ein Fehler generiert. Der Zeiger wird als Byte-Offset im Datenspeicher des Pufferobjekts behandelt. Der Puffer - Objekt - Bindung (GL_ARRAY_BUFFER_BINDING) wird gespeichert als generische Vertexattribut - Array - Zustand (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) zum Index - Index .
Wenn ein generisches Vertex-Attribut-Array angegeben wird, werden Größe , Typ , Normalisierung , Schritt und Zeiger zusätzlich zur aktuellen Bindung des Vertex-Array-Pufferobjekts als Vertex-Array-Status gespeichert.
Es scheint, dass sowohl der Byte-Offset als auch die Pufferobjektbindung gültig bleiben könnten, selbst wenn der Datenspeicher durch etwas anderes ersetzt wurde. Ich konnte aber auch sehen, dass es so implementiert wird, dass zum Zeitpunkt des Aufrufs die Bindung einen bestimmten Zeiger in den Datenspeicher erfasst , der ungültig wird, wenn der Datenspeicher ersetzt wird. Keiner der beiden Wege scheint durch den Wortlaut ausgeschlossen zu sein.
Antworten
Es scheint, dass die Bindungen von glVertexAttribPointer () auch nach nachfolgenden Aufrufen von glBufferData () gültig bleiben. Ich habe dies festgestellt, indem ich es ausprobiert habe, was kein 100% iger Beweis ist - es könnte nur in dieser Implementierung funktionieren (in meinem Fall NVidia-Treiber).
Wenn jedoch ein Rückruf- und Debug-Modus für Fehlermeldungen aktiviert ist, wird beim zweiten Aufruf von glBufferData () die folgende Meldung angezeigt, die stark darauf hindeutet, dass diese Situation erwartet / ausgelegt ist für:
[LWJGL] OpenGL-Debug-Nachricht
ID: 0x20071
Quelle: API
Typ: ANDERE
Schweregrad: MITTEILUNG
Nachricht: Puffer Detailinfo: Pufferobjekt 1 (gebunden an GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0), GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (1) und GL_ARRAY_BUFFER_ARB, Verwendungshinweis ist GL_STATICD.
Die ersten beiden Bindungen stellen meine beiden Aufrufe von glVertexAttribPointer () dar und sind nicht in der Nachricht enthalten, die beim ersten Aufruf von glBufferData () protokolliert wird.