Kurze Antwort:
Verwenden glMapBufferRange und nur die subrange aktualisieren, die Änderung muss.
Lange Antwort:
Der Trick ist es, die bereits bestehenden Puffer mit glMapBufferRange, kartieren und dann Karte nur den Bereich, den Sie brauchen. Unter diesen Annahmen:
- Ihre Geometrie verwendet pro-Vertex-Animation
- Die Vertex-Zählung für die Modelle Morphing ist konstant während der Animation.
Dann können Sie glMapBufferRange verwenden nur die sich ändernden Teile, zu aktualisieren und den Rest der Daten in Ruhe lassen. Volle Uploads mit glBufferData sind langsam wie eine Schildkröte, weil sie den alten Speicher löschen und einen neuen zuweisen. Das ist zusätzlich zum Hochladen der neuen Daten. glMapBufferRange können Sie nur vorhandene Daten lesen/schreiben, keine Zuordnung oder Freigabe.
Wenn Sie jedoch Skeleton-Animationen verwenden, übergeben Sie Vertex-Transformationen als 4x4-Matrizen pro Vertex an den Vertex-Shader und führen Sie die Berechnungen dort durch. Per-Vertex-Daten werden natürlich mit glVertexAttribPointer angegeben.
Denken Sie auch daran, dass Sie Texturdaten im Vertex-Shader lesen können und dass OpenGL 3.1 einige neue Aufrufe von Instanzaufrufen eingeführt hat; glDrawArraysInstanced und glDrawElementsInstanced. Diese Kombination kann für instanzspezifische Suchvorgänge verwendet werden. Das heißt, Sie können Instanzenaufrufe mit derselben Geometriedatenbindung ausführen, aber Positionen oder andere Daten, die Sie als Vertex benötigen, als Texturen oder Textur-Arrays senden. Dies kann Sie davor bewahren, verschiedene Vertex-Array-Datensätze zu mischen und anzupassen.
Stellen Sie sich vor, Sie möchten 100 Instanzen desselben Modells mit unterschiedlichen Positionen oder Farbschemata darstellen. Oder sogar Texturkarten.
+1 für die Erkennung Batching als das größte Problem mit Grafik-Codierung in diesen Tagen. 1 Zeichen Anruf pro Mhz scheint optimistisch zu mir nach einigen OpenGL ES iPhone-Codierung - Ich habe festgestellt, ich bin auf 30-40 Chargen beschränkt, um eine anständige Framerate zu erhalten! – tsalter
Ok, ich hätte hinzufügen sollen, dass diese Regel möglicherweise nicht direkt auf Mobilgeräte zutrifft. Ich habe es vor einigen Jahren auf einigen GDC-Folien gesehen und es hat mir auf Windows-PCs gut getan. –
Btw, ich habe die Folien hier gefunden: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (hauptsächlich D3D9, OpenGL auf Seite 28) –