OpenGL: VBO handling
-
Hi!
Also mal zum Grundaufbau meiner Engine:
- Meshs bestehen aus Surfaces
- Surfaces bestehen aus einem Material sowie VBO
- Vertices in triangles werden indiziert(also ein Vertex für mehrere Triangles nutzbar)Das Surfacesystem soll Methoden bereitstellen wie CreateVertex, CreateTriangle, SetVertexPosition, GetVertexNormal usw.
Hier nun die Fargen dazu:
- Ist es möglich die Indizes in einem eigenen VBO unterzubringen? Wenn ja, wäre das schneller, als die Inzdies in einem Array im WorkRAM zu speichern?- Sollte man für VBOs mit glDrawElements oder glInterleavedArrays zeichnen? Wobei ich bei glInterleavedArrays denke, dass sich Indizes nicht damit realisieren lassen ?oder
- Bei den Methoden wie SetVertexPosition bzw. GetVertexPosition wo die Daten gerade mal 12 Byte groß sind, sollte man da besser im Hintergrund drotzdem das ganze in einem Array speichern, oder immer den Buffer binden, und über glBufferSubData die Daten abfragen/setzen?
- Wie kann man die Methoden wie CreateVertex am besten realisieren? Damit meine ich, wie kann ich am besten einen Buffer vergrößern(oder auch verkleinern). Die Daten erst im WorkRAM abzuspeichern, den Buffer vergrößern, die alten Daten hinein kopieren ist sicherlich nicht die effizienteste Lösung. Oder vergrößert glBufferDataARB den Buffer automatisch?
mfg olli
Edit: Wenn die VBO Extension unterstützt wird, wird sie dann Hardwaremäsig unterstützt, oder wäre es möglich, das dies nur der Treiber emuliert?
-
- Ist es möglich die Indizes in einem eigenen VBO unterzubringen? Wenn ja, wäre das schneller, als die Inzdies in einem Array im WorkRAM zu speichern?
Ist moeglich, allerdings ist es keines wegs schneller, es kann sogar bei manchen Systemkonfigurationen zur Slideshow fuehren.
- Sollte man für VBOs mit glDrawElements oder glInterleavedArrays zeichnen? Wobei ich bei glInterleavedArrays denke, dass sich Indizes nicht damit realisieren lassen ?oder
glInterleaved ist mit VBO moeglich. Allerdings ist glDrawRangedElements immer noch etwas performanter. Ich persoenlich benutzte fast immer Interleaved, da sie einfacher zu handeln sind, als mehrere Pointer.
- Bei den Methoden wie SetVertexPosition bzw. GetVertexPosition wo die Daten gerade mal 12 Byte groß sind, sollte man da besser im Hintergrund drotzdem das ganze in einem Array speichern, oder immer den Buffer binden, und über glBufferSubData die Daten abfragen/setzen?
Hast du ganz sicher immer nur einen Zugriff auf das Array? Das wuerde mich wundern! Lege irgendwo ab, welcher Buffer gerade gebunden ist, und wenn der beim aufruf gleich dem letzten ist, benutze ihn weiter.
Dauernde Bufferswitches kosten nur Zeit. Versuche lieber einen fertig zu machen, und dann den naechsten Buffer zu bearbeiten.- Wie kann man die Methoden wie CreateVertex am besten realisieren? Damit meine ich, wie kann ich am besten einen Buffer vergrößern(oder auch verkleinern). Die Daten erst im WorkRAM abzuspeichern, den Buffer vergrößern, die alten Daten hinein kopieren ist sicherlich nicht die effizienteste Lösung. Oder vergrößert glBufferDataARB den Buffer automatisch?
Dabei habe ich leider keinerlei Erfahrungen, da ich die dynamischen Buffer lieber etwas groesser erstelle, als nachzuallokieren.
-
Vielen Dank, das bringt mich schonmal viel weiter! Ich mache es jetzt so, dass ich im WorkRAM die Vertices abspeichere, egal ob VBO-Support oder nicht. Habe jetzt herausgefunden, dass glBufferDataARB verschiedene Größen annehmen kann. Somit mache ich einfach eine Update-Methode wo dann die Daten aus dem WorkRAM in den VideoRAM kopiert werden.
Ich hoffe nur, dass das schnell genug ist. Habe hier eine Vergleichs-Engine die deutlich schneller lief als meine noch VertexArrays benutzt hatte.
mfg olli
Edit: Year! Die Engine ist um das 3 fache schneller geworden und erreicht bei mehreren Surfaces sogar mehr FPS als die Vergleichs-Engine