Was ist ein Schablonenpuffer?


26

Wikipedia gibt an, dass ein Schablonenpuffer ein beliebiger Puffer ist, den ein Shader verwenden kann.

Es deutet jedoch darauf hin, dass es zum Ausschneiden oder anderweitigen "engen Binden" der Tiefen- und Pixelpuffer verwendet wird, was sich leicht widerspricht.

Was macht der Schablonenpuffer wirklich und wie wird er in modernen Anwendungen praktisch eingesetzt?

Antworten:


31

Die Schablonenpuffer-Definition von Wikipedia ist in der Tat nicht großartig, sie konzentriert sich zu sehr auf die Details moderner Implementierungen (OpenGL). Ich finde die eindeutige Version verständlicher:

Eine Schablone ist eine Vorlage, mit der bei jeder Verwendung identische Buchstaben, Symbole, Formen oder Muster gezeichnet oder gemalt werden. Das mit einer solchen Vorlage erzeugte Design wird auch als Schablone bezeichnet.

Das war es, was Schablone vor Computergrafik bedeutete. Wenn Sie Schablone in Google Bilder eingeben, ist dies eines der ersten Ergebnisse:

Schablonenmaske

Wie Sie sehen, ist es einfach eine Maske oder ein Muster, mit dem das Negativ des Musters auf etwas "gemalt" werden kann.

Der Schablonenpuffer funktioniert genauso. Sie können den Schablonenpuffer mit einem ausgewählten Muster füllen, indem Sie einen Schablonenrenderdurchlauf ausführen, dann die entsprechende Schablonenfunktion einstellen, die definiert, wie das Muster in nachfolgenden Zeichnungen interpretiert werden soll, und dann die endgültige Szene rendern. Pixel, die gemäß der Vergleichsfunktion in die zurückgewiesenen Bereiche der Schablonenmaske fallen, werden nicht gezeichnet.


Wenn es um die Implementierung des Schablonenpuffers geht, ist er manchmal tatsächlich mit dem Tiefenpuffer gekoppelt. Die meiste Grafikhardware verwendet einen Schablonenpuffer von 1 Byte (8 Bit), was für die meisten Anwendungen ausreicht. Tiefenpuffer werden normalerweise mit 3 Bytes (24 Bits) implementiert, was normalerweise für die meisten Arten von 3D-Rendering ausreicht. Es ist daher nur logisch, die 8 Bits des Schablonenpuffers mit den anderen 24 Bits des Tiefenpuffers zu packen, wodurch es möglich wird, jedes Tiefen- + Schablonenpixel in einer 32-Bit-Ganzzahl zu speichern. Das hat Wikipedia gemeint mit:

Der Tiefenpuffer und der Schablonenpuffer teilen sich oft den gleichen Bereich im RAM der Grafikhardware.


Eine Anwendung, in der der Schablonenpuffer früher König war, war das Rendern von Schatten in einer Technik, die als Schattenvolumen oder manchmal auch als Schablonenschatten bezeichnet wurde . Dies war eine sehr clevere Verwendung des Puffers, aber heutzutage scheint sich der größte Teil des Rendering-Felds in Richtung tiefenbasierter Schattenkarten verlagert zu haben.


Es ist ein Charakter, aber cleaver-> clever. Ich kann es nicht bearbeiten. D: Tolle Antwort, das macht bisher am meisten Sinn.
Qix

3
Wenn Sie einen teuren Pro-Pixel-Shader haben, können Sie mit dem Schablonenpuffer auch ähnliche Threads stapeln, um die Divergenz zu verringern und die Belegung zu erhöhen, wie in diesem OIT-Artikel, Abschnitt 2.6 (Haftungsausschluss: Ich bin ein Autor).
Josxyqk

@jozxyqk, das ist etwas außerhalb der Box genau dort zu denken! Sehr schön.
Glampert

13

Der Schablonenpuffer ist ein vorzeichenloser Ganzzahlpuffer, in der Regel 8-Bit, in dem Sie nach einem Schablonentest Informationen pro Pixel nach Belieben füllen können, basierend auf der Verwendung verschiedener Operationen (hier OpenGL Ops ).

Der Schablonentest ist einfach eine Pro-Pixel-Operation, bei der der aktuelle Pixelschablonenwert gegen den Inhalt des Schablonenpuffers getestet wird. Sie legen die Bedingung fest, unter der der Schablonentest bestanden wird (z. B. IMMER, WENIGER usw.).

Sie können in Abhängigkeit vom Ergebnis des Tests entscheiden, was mit dem Schablonenwert geschieht (in OpenGL mit der von mir oben verknüpften Operation).

Der Schablonenpuffer hat einige Verwendungszwecke. Die ersten, die mir in den Sinn kommen, sind:

  • Es kann als Maske verwendet werden, um einen bestimmten Teil des Framebuffers selektiv zu rendern und den Rest zu verwerfen. Dies ist zum Beispiel nützlich für Reflexionen, aber auch viel mehr. Beim Rendern mit mehreren Auflösungen können Kanten markiert werden, die mit einer höheren Auflösung gerendert werden müssen. Es gibt wirklich viele Maskierungsanwendungen.
  • Ein sehr einfacher Überziehfilter zum Beispiel. Sie können den Schablonentest so einstellen, dass er den Wert immer besteht und immer erhöht. Der Wert, den Sie im Schablonenpuffer haben, steht für Ihre Überziehung. [*]

In der Vergangenheit wurde es auch für Shadow-Techniken wie Shadow-Volume verwendet.

Der schlechte Schablonenpuffer wird oft unterschätzt, kann aber eine gute Waffe im Arsenal eines Grafikprogrammierers sein.

[*] Wert, der im Nachhinein mit dem richtigen SRV zurückgelesen werden soll!

EDIT: Erwähnenswert ist auch, dass Sie in Shader Model 5.1 (also D3D11.3 und D3D12) über auf den Schablonenreferenzwert zugreifen können SV_StencilRef


6

Ein Schablonenpuffer enthält Ganzzahldaten pro Pixel, mit denen Sie mehr Kontrolle darüber erhalten, welche Pixel gerendert werden.

Ein Schablonenpuffer arbeitet ähnlich wie ein Tiefenpuffer. In ähnlicher Weise werden die Schablonendaten in einem Tiefenpuffer gespeichert. Während Tiefendaten bestimmen, welches Pixel der Kamera am nächsten liegt, können Schablonendaten als allgemeinere Maske pro Pixel zum Speichern oder Verwerfen von Pixeln verwendet werden. Verwenden Sie zum Erstellen der Maske eine Schablonenfunktion, um einen Referenzschablonenwert - einen globalen Wert - bei jedem Rendern eines Pixels mit dem Wert im Schablonenpuffer zu vergleichen.

Quelle: Was ist ein Schablonenpuffer? | Microsoft Developer Network

Die allgemeine Idee ist , dass Sie einen Wert für jedes Pixel festlegen und dann den Betrieb ( GREATER, SMALLER, EQUALusw.), wenn dieser auswertet , um wahr das Pixel schattiert ist und gezeigt.

Eine Anwendung ist die Echtzeitreflexion. Beim Rendern der Reflexionstextur wird der Schablonenpuffer verwendet, um eine Maske für die Stelle zu erstellen, an der die Reflexion angewendet wird. Wenden Sie die Reflexion beispielsweise nur auf die schattierten Dreiecke des Glasmaterials an. Es kann auch verwendet werden, um beliebige zweidimensionale Masken für den gesamten Framebuffer zu erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.