Objekte vor dem Rendern sortieren

10

Ich versuche, ein Szenendiagramm zu implementieren, und in allen Artikeln, die mir begegnet sind, wird über die Sortierung von Objekten gesprochen. So würden Sie Ihre Objekte beispielsweise nach "Material" sortieren. Bis ich mich hinsetzte und anfing, es zu implementieren, hielt ich das für selbstverständlich, weil es Sinn machte. Aber jetzt frage ich mich, was sich beim Sortieren tatsächlich ändert?

In meiner Engine habe ich einen Manager für UBOs. Ich verwende diese zum Speichern von Daten, die von Programmen gemeinsam genutzt werden. Im Moment sind nur Zeit-, Kamera- und Projektionsmatrizen und Lichter erforderlich (ich mache mir keine Sorgen darüber, welche Lichter sich auswirken welche Objekte ATM).

Jetzt muss ich für jedes Modell das Modell in eine Weltmatrix-Uniform ändern, keine Sortierung wird das ändern. Ist der Sprung von der Änderung dieser Matrix zur Einstellung eines Materials für jedes Objekt so schlecht?

Ich erinnere mich vage daran, irgendwo gelesen zu haben, dass jedes Mal, wenn Sie etwas in der Pipeline ändern, es geleert werden muss und dies zu Leistungsproblemen führen kann. Aber für jeden Zeichnungsaufruf richte ich trotzdem ein Modell für die Weltmatrix ein. Welchen Sinn macht es also, jemals darüber besorgt zu sein?

Übrigens gibt es Informationen darüber, ob das Ändern einer Uniform und das Aufrufen von glBufferSubData mehr (oder weniger) teuer ist.

Dreta
quelle
3
Schnelle Antwort: Ja, der Sprung vom Ändern einer Matrix zum Festlegen von Materialien für jedes Objekt ist so schlecht. An dieser Stelle würde ich vorschlagen, einen Abstecher zu machen, um sich über OpenGL-Tools zur Leistungsmessung für Ihre Plattform zu informieren, bevor Sie fortfahren. Mit Perf-Tools können Sie auf einfache Weise verschiedene Techniken messen und herausfinden, welche für die Anforderungen Ihres Renderers am besten geeignet sind. Plus diese Werkzeuge werden Sie Ihre gesamte Karriere vorwärts halten, während dieser eine Renderer ... nicht so sehr ;-)
Patrick Hughes
@PatrickHughes super, danke, ich werde diese auf jeden Fall überprüfen
dreta

Antworten:

4

Sie möchten auf jeden Fall sortieren, um Materialien zu stapeln. Wenn Sie können, können Sie auch die Instanz verwenden, um die Geometrie zu stapeln (z. B. wenn Sie die X-Nummer derselben Objekte haben).

Es ist auch immer noch wertvoll, nach Tiefe zu sortieren. Sie müssen nach transparenten Objekten von hinten nach vorne sortieren (wobei Sie einige erweiterte Techniken ignorieren, die diese Notwendigkeit unter bestimmten Umständen beseitigen).

Es ist auch sinnvoll, undurchsichtige Objekte von vorne nach hinten zu sortieren, da Early-Z den Fragment-Shader-Overhead Ihrer Szene erheblich reduzieren kann.

Sean Middleditch
quelle
3
Das Bestellen der undurchsichtigen / transparenten Objekte ist in komplexen Situationen nicht einfach (bis zu dem Punkt, dass dies ohne willkürliche Regeln unmöglich ist). Sie können auch nach Texturen gruppieren, um gl-Aufrufe zu reduzieren.
Darkwings
Die Reihenfolge nach Textur ist erforderlich, um Anrufe zu stapeln und Draw-Anrufe zu reduzieren. Das Sortieren hat nichts mit dem Reduzieren von Draw Calls zu tun. Das Sortieren hat damit zu tun, dass das Rendering tatsächlich korrekt ist (für transparente Objekte) oder der Overhead des Fragmentprozessors minimiert wird (für undurchsichtige Objekte). "Komplex" zu sein ist ein Problem, ja, aber genau dafür werden Grafikprogrammierer von Game Engine bezahlt, um Spiele auf Standardhardware spielbar zu machen. Die Hardwareeffizienz zwischen sortierten und unsortierten undurchsichtigen Objekten allein kann sehr hoch sein.
Sean Middleditch
opengl.org/wiki/Transparency_Sorting Das habe ich mit "willkürlichen Regeln" gemeint. Es gibt keine objektive "richtige" Sortierung für komplexe Fälle. In Bezug auf "Sortieren" und "Bestellen" wurde im OP eindeutig "Sortieren nach Material" (unabhängig von der Transparenz) angegeben, und ich meinte dasselbe für die Textur, da beide Ziele die Leistung beeinträchtigen.
Darkwings
Um ehrlich zu sein, habe ich noch nie gesehen, dass solche Probleme in echten Spielen zum Tragen kommen. Diese Beispiele spiegeln nicht wirklich wider, wie man Dinge tatsächlich macht, bei denen transparente Objekte im Allgemeinen eine ungefähr gleichmäßige Größe haben und ziemlich "kastenförmige" Kollisionsgrenzen haben, die beide verrückte Überlappungen verhindern. In beiden Fällen ändert die Tatsache, dass "es schwer ist", nichts an seiner Notwendigkeit. Ich habe natürlich auch darauf hingewiesen, dass das Stapeln nach Material wichtig ist, und erwähnte die Instanz, um die Behauptung "Keine Sortierung kann helfen" zu kontrapunktieren. Daher bin ich mir nicht sicher, ob in meiner Antwort etwas Konkretes falsch ist.
Sean Middleditch
Ein Kommentar bedeutet nicht, dass ich in Ihrer Antwort etwas Falsches gefunden habe, und ich habe nie gesagt, dass keine Sortierung helfen kann. Ich habe festgestellt, dass es Fälle gibt, in denen keine objektive korrekte Lösung existiert, daher muss offensichtlich eine Lösung unter Verwendung willkürlicher Regeln gefunden werden. Das sind 2 völlig unterschiedliche Aussagen.
Darkwings
3

Das reine Sortieren von Objekten nach Tiefe hat einen enormen Wert, insbesondere beim Binning oder beim Kacheln von Rendering-Architekturen.

Sortieren Sie Feststoffe von vorne nach hinten und Transparentfolien von hinten nach vorne.

Beim Rendern wird das Material, das der Kamera und dem Volumenkörper am nächsten liegt, zuerst gerendert, und alles andere, das denselben Platz einnimmt, wird durch eine frühzeitige Überprüfung des Z-Puffers zurückgewiesen.

Wenn die Grafikarchitektur über einen hierarchischen oder niedrig aufgelösten Z-Puffer verfügt, wird die Geometrie möglicherweise bereits vor dem Rendern gelöscht.

Jari Komppa
quelle