Game Engines machen die meisten ihrer Shading-Arbeiten pro Pixel oder pro Fragment. Aber es gibt noch eine andere Alternative, die im Film seit Jahrzehnten beliebt ist: das Object Space Shading. Pixar`s Renderman, der bekannteste Renderer für Computergrafik, verwendet die Reyes-Rendering-Methode, die eine Object Space Shading Methode ist.
Dieser Blog befasst sich mit einer Object Space Shading Methode, die auf Hardware der Direct3D 11-Klasse funktioniert. Insbesondere werden wir uns mit dem Shading des Texturraums beschäftigen, die die Texturparametrisierung des Modells nutzt. Shading im Object Space bedeutet, dass wir die Shading-Rate bereits von den Pixeln entkoppelt haben und es ist auch einfach, sie zeitlich zu entkoppeln. Wir haben diese Entkopplungen genutzt, um Wege zur Leistungssteigerung zu finden, aber wir werden auch einige zukünftige Möglichkeiten in diesem Bereich diskutieren.
Textur Space Shading.
Wenn die meisten Menschen den Begriff „Texture Space Shading“ hören, denken sie im Allgemeinen an eine Rasterung der Geometrie im Texturraum. Bei diesem Ansatz gibt es zwei Schwierigkeiten: die Sichtbarkeit und die Wahl der richtigen Auflösung. Rasterung im Texturbereich bedeutet, dass Sie keine Sichtbarkeitsinformationen aus der Kameraansicht haben und am Ende Texte schattieren, die nicht sichtbar sind. Außerdem sind ihre Auflösungsoptionen begrenzt, da Sie nur bei einer Auflösung gleichzeitig rastern können.
Die Wahl der Auflösung ist wichtig, da sie ihre gesamten Shadingkosten erhöht. Jede Midmap-Ebene kostet zusätzlich 4 x Shading-Kosten. Wenn Sie also 512×512 benötigen, um die Pixelrate für einen Teil eines Objekts und 1024×1024 für einen anderen Teil anzupassen, aber Sie können nur einen auswählen, welchen wählen Sie? Wenn Sie 512 x 512 wählen, wird ein Teil des Objektes unter dem Sample liegen. Wenn Sie 1024×1024 wählen, kostet ein Teil ihres Objekts 4x so viel wie nötig. Das steigt mit jedem Level, das du überbrückst. Wenn Sie z.B. ein Objekt haben, das sich über 4 Mipmap-Ebenen erstreckt, können Sie die Shading-Kosten um bis zu 64x erhöhen, um ein bestimmtes Auflösungsziel für das gesamte Objekt zu erreichen.
Also versuchen wir einen anderen Ansatz. Stattdessen rastern wir im Bildschirmbereich und statt des Shadings nehmen wir nur die Texte auf, die wir als Shadingarbeit benötigen. Deshalb haben wir den Begriff „Texel Shading“ gewählt. Da wir aus der Kameraperspektive rastern, erhalten wir die beiden Informationen, die normalerweise in Textur Space Methoden nicht verfügbar sind – Sichtbarkeit nach einem frühen Depth-Test und die Ableitung des Bildschirmbereichs zur Auswahl der Mipmap-Ebene. Das Werk selbst sind die Texte.
Wie Texel Shading funktioniert.
Auf hohem Niveau läuft der Prozess wie folgt ab:
Beachten Sie, dass das Texel Shading wahlweise pro Objekt oder sogar pro Fragment angewendet werden kann. Die Auswahl auf Fragment-Ebene erfolgt zum Zeitpunkt des ersten Geometrie-Durchlaufs, so dass immer noch zusätzliche Kosten für andere Stufen anfallen, aber es ermöglicht den Rückgriff auf das Standard-Forward-Rendering. Außerdem können Sie die Shadingarbeit zwischen Texel Shading und Pixel Shading aufteilen.
Eine Information, die man wissen sollte, ist, dass wir tatsächlich 8×8 Kacheln von Textilien beschatten. Wir haben eine Art Cache, der einen Eintrag pro Kachel hat, den wir verwenden, um redundante Kabelschattierungen zu eliminieren, sowie eine Altersverfolgung für Techniken, die Shadings aus früheren Frames verwenden.
Das zweite ist, dass wir Vertex-Attribute im Compute-Shader interpolieren müssen. Dazu haben wir eine Map, die wir „Triangle Index Textur“ nennen, mit der wir bestimmen, welches Triangle wir für das Shading eines bestimmten Texels benötigen.
Die Nachteile.
Das allein bringt ihnen keinen Nutzen. Tatsächlich entstehen zusätzliche Kosten auf verschiedene Weise:
Vorteile und Potenzial.
Sobald Sie jedoch einen solchen Object Space gerendert haben, eröffnen sich neue Möglichkeiten. Wir werden einige von ihnen in diesem Abschnitt auflisten. Die ersten Beiden und ein wenig von dem Dritten, sind das, was wir bisher ausprobiert haben. Den Rest werden wir in Zukunft ausprobieren.
Integration in bestehende Engines.
Wir sind nicht die Ersten, die so etwas versuchen. Die Nitrous-Engine verwendet zum Beispiel eine Textur-Space-Shading-Technik, die für die von ihnen angepeilten Real Time Strategy (RTS)-Spiele geeignet ist. Sie müssen sich nicht so sehr um Objekte kümmern, die sich über Mipmap-Ebenen oder verdeckte Texte erstrecken und so haben sie einen anderen Ansatz gewählt.
Texel Shading passt natürlicher in einen Forward Rendering Pass als in einen Deferred (soweit ich darüber nachgedacht habe – obwohl man auch Deferred Texture Space Shading machen könnte). Es erfordert, dass das Objekt eine eindeutige Texturparametrierung hat, wie es oft bei einer Lightmap der Fall ist. Es benötigt auch Platz für die Textur der schattierten Ergebnisse und die Wahl, wie hoch die Auflösung sein soll. Dies hängt davon ab, wie die Textur verwendet werden soll – nicht alle Shadings müssen im Textur Space vorgenommen werden.
Wenn es Texturen gibt, die die eindeutige Parametrisierung nicht verwenden, werden zusätzliche Ableitungen für die Suche auf Mipmap-Ebene benötigt. Dies füllt im Grunde genommen die Funktion der Screenspace-Derivate im Standard-Midmapping aus, versucht aber stattdessen, die Rate der zweiten Textur mit der ersten zu vergleichen. Da die Abbildung von einem UV-Satz auf den anderen jedoch tendenziell fest bleibt, kann sie möglicherweise vorberechnet werden.
Was die Engineintegration angeht, würde es die Fähigkeit erfordern, den Index und den Vertex-Puffer des Objekts während eines Compute-Shader-Passes zu binden, vorzugsweise einen Vertex-Puffer, der aus Performance-Gründen bereits gehäutet ist. Alternativ können Sie auch alles vorinterpolieren, was sich nicht dynamisch ändert, aber mehr Speicher kostet und nicht von uns ausprobiert wurde.
Die Übernahme von Texel Shading erfordert keine Alles-oder-nichts-Wahl. Sie können es auf ein einzelnes Objekt anwenden. Sie können sogar eine Auswahl pro Fragment innerhalb dieses Objekts treffen.
Schlußfolgerungen.
Wir haben einen Weg beschrieben, wie man mit Direct3D 11-Hardware Object Space Shadings durchführen kann. Es ist ein Textur Space Ansatz, verwendet aber eine Kamera-Rasterung, um bei der Okklusion und der Auswahl der richtigen Mipmap-Ebene für eine bestimmte Ansicht zu helfen. Wir haben einige Möglichkeiten erforscht, die Shaderlast durch räumliche und zeitliche Entkopplung der Shading-Rate zu reduzieren, aber es gibt noch viel mehr zu erforschen.