Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Kippstrahl

Frischling

  • »Kippstrahl« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Kiel

Beruf: 12.JG

  • Private Nachricht senden

1

25.09.2011, 22:09

Zugriff auf VertexBuffer

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?

Fnord42

Frischling

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

2

25.09.2011, 23:06

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.

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Fnord42« (26.09.2011, 11:18)


Kippstrahl

Frischling

  • »Kippstrahl« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Kiel

Beruf: 12.JG

  • Private Nachricht senden

3

26.09.2011, 19:17

Zu sagen ist wohl, dass ich DX VB's benutze. Aber in GL würde ich das dann so realisieren, wie du es vorgeschlagen hast. Jedoch wäre es in diesem Beispiel viel zu viel Overhead.
Ich habe ein bisschen überlegt und werde mich wohl eines Trickes bedienen, bei dem einfach per ZBuffer die Bilder in den Würfel reinblende, ohne den ganzen VB neu erstellen zu müssen. Das wär bei einer 8-Bilder-Animation auf einem Würfel wahrscheinlich auch viel zu heftig in Echtzeit. Ich werde nach wie vor die nur sichtbare Vertices in den Buffer schreiben, muss nicht einmal darauf zurückgreifen.

Mein Problem habe ich einfach so gelöst, dass der benachbarte VB einfach auch geupdatet wird, falls dort neue Seiten zum Vorschein kommen sollen.

Werbeanzeige