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:
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.
cleaver
->clever
. Ich kann es nicht bearbeiten. D: Tolle Antwort, das macht bisher am meisten Sinn.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:
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
quelle
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
,EQUAL
usw.), 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.
quelle