Schablonenpuffer
Ein Schablonenpuffer wird zum Maskieren von Pixeln in einem Bild verwendet, um Spezialeffekte zu erzeugen. Die Maske steuert, ob das Pixel gezeichnet wird oder nicht. Zu diesen Spezialeffekten gehören Compositing; Decaling; löst sich auf, blendet und streift; Konturen und Silhouetten; und zweiseitige Schablone. Einige der häufigeren Effekte werden unten gezeigt.
Der Schablonenpuffer aktiviert oder deaktiviert die Zeichnung auf die Renderzieloberfläche auf Pixelbasis. Auf seiner grundlegendsten Ebene ermöglicht es Anwendungen, Abschnitte des gerenderten Bilds zu maskieren, sodass sie nicht angezeigt werden. Anwendungen verwenden häufig Schablonenpuffer für Spezialeffekte wie Auflösungen, Dekalierung und Gliederung.
Schablonenpufferinformationen werden in die Z-Pufferdaten eingebettet.
Funktionsweise des Schablonenpuffers
Direct3D führt einen Test für den Inhalt des Schablonenpuffers auf Pixelbasis durch. Für jedes Pixel auf der Zieloberfläche wird ein Test mit dem entsprechenden Wert im Schablonenpuffer, einem Schablonenverweiswert und einem Schablonenformatwert durchgeführt. Wenn der Test erfolgreich ist, führt Direct3D eine Aktion aus. Der Test wird in den folgenden Schritten durchgeführt.
- Führen Sie einen bitweisen AND-Vorgang des Schablonenverweiswerts mit dem Schablonenformat aus.
- Führen Sie einen bitweisen AND-Vorgang des Schablonenpufferwerts für das aktuelle Pixel mit dem Schablonenformat aus.
- Vergleichen Sie das Ergebnis von Schritt 1 mit dem Ergebnis von Schritt 2 mithilfe der Vergleichsfunktion.
Die oben genannten Schritte sind in der folgenden Codezeile dargestellt:
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
- StencilRef stellt den Schablonenverweiswert dar.
- StencilMask stellt den Wert des Schablonenformats dar.
- CompFunc ist die Vergleichsfunktion.
- StencilBufferValue ist der Inhalt des Schablonenpuffers für das aktuelle Pixel.
- Das kaufmännische Und-Zeichen (&) stellt den bitweisen AND-Vorgang dar.
Das aktuelle Pixel wird auf die Zieloberfläche geschrieben, wenn der Schablonentest erfolgreich ist und andernfalls ignoriert wird. Das Standardvergleichsverhalten besteht darin, das Pixel zu schreiben, unabhängig davon, wie sich jeder bitweise Vorgang herausstellt. Sie können dieses Verhalten ändern, indem Sie den Wert eines aufgezählten Typs ändern, um die gewünschte Vergleichsfunktion zu identifizieren.
Ihre Anwendung kann den Vorgang des Schablonenpuffers anpassen. Sie kann die Vergleichsfunktion, das Schablonenformat und den Schablonenverweiswert festlegen. Sie kann auch die Aktion steuern, die Direct3D ausführt, wenn der Schablonentest erfolgreich ist oder fehlschlägt.
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.
Obwohl mehrere Texturmischungen verwendet werden können, um dieses Problem zu lösen, schränkt dies die Anzahl anderer Spezialeffekte ein, die Ihre Anwendung erzeugen kann. Wenn Sie den Schablonenpuffer verwenden, um Decals anzuwenden, werden Texturmischungsstufen für andere Effekte freigegeben.
Auflösungen, Überblendungen und Wischen
Anwendungen verwenden zunehmend Spezialeffekte, die häufig in Filmen und Videos verwendet werden, z. B. Auflösungen, Wischen und Überblendungen.
In einer Auflösung wird ein Bild allmählich durch ein anderes in einer gleichmäßigen Abfolge von Frames ersetzt. Obwohl Direct3D Methoden zur Verwendung mehrerer Texturmischungen bereitstellt, um denselben Effekt zu erzielen, können Anwendungen, die den Schablonenpuffer für Auflösungen verwenden, Texturmischungsfunktionen für andere Effekte verwenden, während sie eine Auflösung ausführen.
Wenn Ihre Anwendung eine Auflösung ausführt, muss sie zwei verschiedene Bilder rendern. Er verwendet den Schablonenpuffer, um zu steuern, welche Pixel aus jedem Bild auf die Renderzieloberfläche gezeichnet werden. Sie können eine Reihe von Schablonenmasken definieren und in den Schablonenpuffer auf aufeinander folgenden Frames kopieren. Alternativ können Sie eine Basisschablonenmaske für den ersten Frame definieren und inkrementell ändern.
Am Anfang der Auflösung legt die Anwendung die Schablonenfunktion und die Schablonenmaske so fest, dass die meisten Pixel aus dem Startbild den Schablonentest bestehen. Die meisten Pixel aus dem Endbild sollten den Schablonentest nicht bestehen. Bei aufeinander folgenden Frames wird das Schablonenformat aktualisiert, sodass weniger Pixel im Startbild den Test bestehen. Wenn die Frames vorankommen, schlagen weniger und weniger Pixel im Endbild den Test fehl. Auf diese Weise kann Ihre Anwendung eine Auflösung mit jedem beliebigen Auflösungsmuster durchführen.
Das Einblenden oder Ausblenden ist ein Sonderfall des Auflösens. Beim Einblenden wird der Schablonenpuffer verwendet, um von einem schwarzweißen Bild in ein Rendering einer 3D-Szene aufzulösen. Das Ausblenden ist das Gegenteil, Ihre Anwendung beginnt mit einem Rendering einer 3D-Szene und löst sich in Schwarzweiß auf. Die Einblendung kann mit jedem beliebigen Muster erfolgen, das Sie verwenden möchten.
Direct3D-Anwendungen verwenden eine ähnliche Technik für Wischbewegungen. Wenn eine Anwendung z. B. eine Wischbewegung von links nach rechts durchführt, wird das Endbild nach und nach über dem Startbild von links nach rechts geschoben. Wie in einer Auflösung müssen Sie eine Reihe von Schablonenmasken definieren, die in den Schablonenpuffer auf aufeinander folgenden Frames geladen werden, oder die Anfangsschablonenmaske nacheinander ändern. Die Schablonenmasken werden verwendet, um das Schreiben von Pixeln vom Startbild zu deaktivieren und das Schreiben von Pixeln aus dem Endbild zu aktivieren.
Eine Wischbewegung ist etwas komplexer als eine Auflösung, in der Ihre Anwendung Pixel aus dem Endbild in umgekehrter Reihenfolge der Wischbewegung lesen muss. Wenn die Wischbewegung von links nach rechts erfolgt, muss Ihre Anwendung Pixel aus dem Endbild von rechts nach links lesen.
Konturen und Silhouetten
Sie können den Schablonenpuffer für abstraktere Effekte wie Konturen und Silhouetten verwenden.
Wenn Ihre Anwendung ein Schablonenformat auf das Bild eines Grundtyps anwendet, der die gleiche Form hat, aber etwas kleiner ist, enthält das resultierende Bild nur die Gliederung des Grundtyps. 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.
Verwandte Themen