2016-09-18 3 views
0

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

1

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.

+0

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

0

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.