Moin, ich sitze gerade an meinem MC-Klon ( siehe meinen andere Thread ). Ich stehe momentan vor dem Problem, einen VertexBuffer zu aktualisieren. Derzeit schreibe ich in den VertexBuffer nur die Vertices, die auch sichtbar sind (ich dachte am Anfang, dass es Overhead wäre, den man vermeiden könnte).
Nun möchte ich aber geziehlt einzelne Seiten der Würfel verändern (z.B eine Textur draufblenden), ohne den gesamten VertexBuffer neu zu erstellen. Dies ist jedoch mit meinem speichersparendem Konzept nicht möglich, da sich aufgrund der Lücken alles verschiebt.
Muss ich nun doch ausnahmslos alle Vertices in den VertexBuffer verschieben und dann einen dynamischen VB benutzen?
Mir fallen spontan 3 Dinge ein, die dir eventuell von Nutzen sein könnten (kenne deinen MC-Klon nicht).
Zum einen könntest du neben dem VertexBuffer noch ein VertexIndexBuffer (GL_ELEMENT_ARRAY_BUFFER) verwenden und mit
glDrawElements statt
glDrawArrays nur die Vertexe mit den Indizes aus dem VertexIndexBuffer rendern. So könntest du den Kommunikations-Overhead zwischen CPU und GPU verringern da du nur neue Indizes statt ganzer Vertexe übertragen musst. Du könntest also bspw. nur die Indizes der Vertexe übergeben, deren Polygone im ViewFrustum liegen.
Desweiteren kannst du mit
glBufferSubData und
glMapBuffer Teile eines Buffers addressieren bzw verändern.
glBufferSubData updated einen Bereich des Buffers, während glMapBuffer einen Pointer zurückgibt mit dem man den Buffer verändern kann (hab ich bisher nur ein einziges mal bei Skelettanimation versucht zu verwenden. Dort hab ich irgendwie sobald ich auf die Daten unter dem Pointer zugegriffen hab nen Segfault bekommen aber vllt hast du ja mehr glück
)
Außerdem könntest du mehrere Buffer verwenden. z.B. Einen statischen und einen dynamischen, so liegen die Daten auch in der GPU am richtigen Platz.
edit: Wäre vielleicht noch gut zu wissen ob du die Vertexbuffer in deprecated-Kontext oder in OpenGL3+-Kontext verwendest.