Konfigurieren der Tiefenschablonenfunktionalität
In diesem Abschnitt werden die Schritte zum Einrichten des Tiefenschablonenpuffers und des Tiefenschablonenzustands für die Ausgabezusammenführungsphase behandelt.
Wenn Sie wissen, wie Sie den Tiefenschablonenpuffer und den entsprechenden Tiefenschablonenzustand verwenden, lesen Sie erweiterte Schablonentechniken.
Tiefenschablonenzustand erstellen
Der Tiefenschablonenzustand teilt der Ausgabezusammenführungsphase mit, wie der Tiefenschablonentest durchgeführt wird. Der Tiefenschablonentest bestimmt, ob ein bestimmtes Pixel gezeichnet werden soll.
Binden von Tiefenschablonendaten an die OM-Phase
Binden Sie den Tiefenschablonenzustand.
Binden Sie die Tiefenschablonenressource mithilfe einer Ansicht.
Renderziele müssen alle denselben Ressourcentyp aufweisen. Wenn Multisample-Antialiasing verwendet wird, müssen alle gebundenen Renderziele und Tiefenpuffer dieselbe Beispielanzahl aufweisen.
Wenn ein Puffer als Renderziel verwendet wird, werden Tiefenschablonentests und mehrere Renderziele nicht unterstützt.
- So viele wie 8 Renderziele können gleichzeitig gebunden werden.
- Alle Renderziele müssen in allen Dimensionen dieselbe Größe aufweisen (Breite und Höhe und Tiefe für 3D- oder Arraygröße für *Arraytypen).
- Jedes Renderziel verfügt möglicherweise über ein anderes Datenformat.
- Schreibmasken steuern, welche Daten in ein Renderziel geschrieben werden. Das Ausgabeschreibformat-Steuerelement für ein Renderziel pro Komponentenebene, welche Daten in das Renderziel(n) geschrieben werden.
Erweiterte Schablonentechniken
Der Schablonenteil des Tiefenschablonenpuffers kann zum Erstellen von Renderingeffekten wie Compositing, Decaling und Outlining verwendet werden.
- Compositing
- Decaling
- Konturen und Silhouetten
- Zweiseitige Schablone
- Lesen des Tiefenschablonenpuffers als Textur
Zusammensetzung
Ihre Anwendung kann den Schablonenpuffer verwenden, um 2D- oder 3D-Bilder in einer 3D-Szene zu kombinieren. Eine Maske im Schablonenpuffer wird verwendet, um einen Bereich der Renderzieloberfläche zu verdecken. Gespeicherte 2D-Informationen, z. B. Text oder Bitmaps, können dann in den verdeckten Bereich geschrieben werden. Alternativ kann Ihre Anwendung zusätzliche 3D-Grundtypen im schablonenformatierten Bereich der Renderzieloberfläche rendern. Sie kann sogar eine ganze Szene rendern.
In Spielen werden oft mehrere 3D-Szenen zusammengesetzt. So zeigen beispielsweise Fahrspiele in der Regel einen Rückspiegel an. Die Spiegel enthält die Ansicht der 3D-Szene hinter dem Treiber. Es handelt sich im Wesentlichen um eine zweite 3D-Szene, die mit der Vorwärtsansicht des Fahrers zusammengesetzt ist.
Decaling
Direct3D-Anwendungen verwenden Decaling, um zu steuern, welche Pixel aus einem bestimmten Grundtypbild auf die Renderzieloberfläche gezeichnet werden. Anwendungen wenden Decals auf die Bilder von Grundtypen an, damit koplanare Polygone richtig gerendert werden können.
Wenn sie z. B. Reifenmarken und gelbe Linien auf eine Straße anwenden, sollten die Markierungen direkt auf der Straße angezeigt werden. Die z-Werte der Markierungen und der Straße sind jedoch identisch. Daher erzeugt der Tiefenpuffer möglicherweise keine saubere Trennung zwischen den beiden. Einige Pixel im Hintergrundgrundtyp werden möglicherweise über dem Frontgrundtyp gerendert und umgekehrt. Das resultierende Bild scheint von Frame zu Frame zu schimmern. Dieser Effekt wird alsZ-Kampf oder Flimmern bezeichnet.
Verwenden Sie zum Beheben dieses Problems eine Schablone, um den Abschnitt des Hintergrundgrundtyps zu maskieren, in dem die Decal angezeigt wird. Deaktivieren Sie die Z-Pufferung, und rendern Sie das Bild des Frontgrundtyps in den maskierten Bereich der Renderzieloberfläche.
Mehrere Texturmischungen können verwendet werden, um dieses Problem zu lösen.
Konturen und Silhouetten
Sie können den Schablonenpuffer für abstraktere Effekte wie Konturen und Silhouetten verwenden.
Wenn Ihre Anwendung zwei Renderdurchläufe ausführt – eine zum Generieren des Schablonenformats und zweitens zum Anwenden des Schablonenformats auf das Bild, aber mit den Grundtypen, die im zweiten Durchlauf etwas kleiner sind – enthält das resultierende Bild nur die Grundform. Die Anwendung kann dann den schablonenformatierten Bereich des Bilds mit einer Volltonfarbe füllen, sodass der Grundtyp ein geprägtes Aussehen erhält.
Wenn das Schablonenformat die gleiche Größe und Form wie der Grundtyp aufweist, den Sie rendern, enthält das resultierende Bild ein Loch, in dem sich der Grundtyp befinden soll. Ihre Anwendung kann dann das Loch mit Schwarz füllen, um eine Silhouette des Grundtyps zu erzeugen.
Zweiseitige Schablone
Schattenvolumes werden zum Zeichnen von Schatten mit dem Schablonenpuffer verwendet. Die Anwendung berechnet die Schattenvolumen, die durch verdeckende Geometrie gegossen werden, indem die Silhouettenränder berechnet und von dem Licht weg in eine Reihe von 3D-Volumes projiziert werden. Diese Volumes werden dann zweimal im Schablonenpuffer gerendert.
Das erste Rendern zeichnet vorwärtsgerichtete Polygone und erhöht die Schablonenpufferwerte. Das zweite Rendern zeichnet die zurückgerichteten Polygone des Schattenvolumens und erhöht die Schablonenpufferwerte.
Normalerweise brechen alle inkrementierten und dekrementierten Werte einander ab. Die Szene wurde jedoch bereits mit normaler Geometrie gerendert, sodass einige Pixel beim Rendern des Schattenvolumens den Z-Puffertest fehlschlagen. Werte, die im Schablonenpuffer verbleiben, entsprechen Pixeln, die sich im Schatten befinden. Diese verbleibenden Schablonenpufferinhalte werden als Maske verwendet, um ein großes, allumfassendes schwarzes Quadrat in die Szene zu blenden. Wenn der Schablonenpuffer als Maske fungiert, besteht das Ergebnis darin, Pixel abzudunkeln, die sich in den Schatten befinden.
Dies bedeutet, dass die Schattengeometrie zweimal pro Lichtquelle gezeichnet wird und somit Druck auf den Vertexdurchsatz der GPU setzt. Das zweiseitige Schablonenfeature wurde entwickelt, um diese Situation zu mindern. Bei diesem Ansatz gibt es zwei Sätze von Schablonenzuständen (siehe unten), jeweils einen Satz für die nach vorne gerichteten Dreiecke und den anderen für die nach hinten gerichteten Dreiecke. Auf diese Weise wird pro Schattenvolumen nur ein einzelner Durchlauf pro Licht gezeichnet.
Lesen des Tiefenschablonenpuffers als Textur
Ein inaktiver Tiefenschablonenpuffer kann von einem Shader als Textur gelesen werden. Eine Anwendung, die einen Tiefenschablonenpuffer als Textur-Rendert in zwei Durchläufen liest, schreibt der erste Pass in den Tiefenschablonenpuffer und der zweite Durchlauf liest aus dem Puffer. Dadurch kann ein Shader Tiefen- oder Schablonenwerte vergleichen, die zuvor in den Puffer geschrieben wurden, mit dem Wert für das aktuell gerenderte Pixel. Das Ergebnis des Vergleichs kann verwendet werden, um Effekte wie Schattenzuordnung oder weiche Partikel in einem Partikelsystem zu erzeugen.