Ich habe viele feste Objekte wie Terrains und Gebäude und ich möchte sie alle in einem VBO zusammenführen, um Draw-Aufrufe zu reduzieren und die Leistung zu verbessern, wenn es zu viele Objekte, Texturen laden und speichern IDs in einem Array, meine Frage ist, kann ich Texturen an diesen einen VBO binden oder muss ich einen separaten VBO für jede Textur machen? oder kann ich viele glDrawArrays
für einen VBO basierend auf Offset und Länge machen, wenn ich das tun kann, wird dies reibungslos und gut durchgeführt werden?Android OpenGL ES2 Viele Texturen für einen VBO
Antwort
Wenn Sie in ES 2.0 mehrere Texturen in einem einzigen Zeichenaufruf verwenden möchten, ist die Verwendung eines Texturatlas die einzig gute Option. Im Wesentlichen speichern Sie die Texturdaten aus mehreren logischen Texturen in einer einzelnen OpenGL-Textur, und die Texturkoordinaten werden so ausgewählt, dass die gewünschten Texturdaten für jedes Grundelement verwendet werden. Dies könnte durch Anpassen der ursprünglichen Texturkoordinaten oder durch Zuführen einer ID in den Shader und Anwenden eines Offsets auf die Texturkoordinaten basierend auf der ID erfolgen.
Natürlich können Sie mehrere glDrawArrays()
Aufrufe für eine einzelne VBO verwenden, mit einer anderen Textur zwischen ihnen binden. Aber das ist gegen dein Ziel, die Anzahl der Draw-Aufrufe zu reduzieren. Sie sollten sicher stellen, dass die Anzahl der Zeichenaufrufe wirklich ein Flaschenhals für Sie ist, bevor Sie viel Zeit für diese Art von Optimierungen aufwenden.
In erweiterten Versionen von OpenGL haben Sie zusätzliche Funktionen, die bei diesem Anwendungsfall helfen können, wie Array-Texturen.
Es gibt einige Standardtechniken, die viele Game Engines ausführen, um niedrige Draw-Aufrufe zu erzielen.
Dosierung: Diese Technik kombiniert alle Objekte, die sich auf dasselbe Material beziehen, und kombiniert sie zu einem Netz. Die Objekte müssen nicht einmal statisch sein. Wenn sie dynamisch sind, können Sie sie immer noch stapelweise verarbeiten, indem Sie das Model Matrix-Array übergeben.
Textur Atlas: Erstellen Textur Atlas für alle statischen Netze ist der beste Weg, wie in der anderen Antwort gesagt. Sie müssen jedoch viel Arbeit aufbringen, um die Texturen effizient zu kombinieren und ihre UVs entsprechend zu aktualisieren.
- 1. OpenGL: mehrere VAOs für einen VBO
- 2. Android OpenGL ES2 Skelettanimation Kind Knochenmatrix
- 3. Android OpenGL ES2 Dreiecke gerendert mit Opazität
- 4. OpenGL ES2 Farbe und Textur-Shader
- 5. Android OpenGL ES 2.0 Texturen
- 6. Problem mit OpenGL VBO
- 7. OpenGL VBO in Haskell
- 8. OpenGL VBO-Setup
- 9. opengl 2.1 und Texturen
- 10. iOS OpenGL ES2 machen Änderung im Vertex-Puffer-Objekt
- 11. Pyramide verzerrt beim Rendern unter android OpenGL ES2
- 12. OpenGL ES: Anzahl der Scheitelpunkte für Texturen
- 13. OpenGL Array Texturen Rendering nicht an allen
- 14. iPhone OpenGL: Tiling Texturen
- 15. OpenGL-Texturen Formateinschränkungen
- 16. OpenGL ES VBO seltsame Speicher Auswirkungen
- 17. Wiederholen von Texturen in OpenGL
- 18. OpenGL ES 1.1 mehrere Texturen pro Mesh
- 19. OpenGL - Versuch, VBO zu verwenden verursacht einen Fehler
- 20. Android OpenGL ES 2. 0 VBO nicht Rendern
- 21. Laden von Texturen in einem Android OpenGL ES App
- 22. OpenGL 2D Texturen jittering/pulsing
- 23. OpenGL-Texturen mit mehreren Anzeigekontexten
- 24. OpenGL C++: Struct Wrapper für VBO wird nicht initialisieren Mitglieder
- 25. OpenGl zeigt keine Dreiecke mit VBO
- 26. Framebuffer, Texturen und glColor Verhalten in OpenGL/OpenGL ES
- 27. Floating Point Texturen in OpenGL ES 2.0
- 28. OpenGL (Kernprofil) Texturen fehlen oder schwarz
- 29. Laden von PNG-Texturen zu OpenGL
- 30. OpenGL ES2 kann nicht angezeigt werden, um etwas anzuzeigen
gut die erste Option wird nicht so einfach für mich, also werde ich die zweite wählen, also was besser separate VBOs erstellen jede hat seine eigene Methode zeichnen oder alle sie dann Call-Zeichen für jede Textur nach dem Offset zu bekommen und die Länge des Teils der VBO? – Mohamed