Der Stencilbuffer (engl. stencil – Schablone, buffer – Puffer) ist in der Computergrafik ein zusätzlich zum Color-Buffer und Z-Buffer vorhandener Teil des Framebuffers. Jedem Pixel ist ein Wert im Stencilbuffer zugeordnet. Die Aufgabe des Stencilbuffers ist es, die Übernahme von Fragmenten in den Framebuffer auf Regionen mit bestimmten Eigenschaften der Stencilwerte einzuschränken. Die zu erfüllende Eigenschaft wird durch die Stencilfunction eingestellt. In welcher Art der Stencilwert bei der Verarbeitung eines Fragments modifiziert wird, wird durch die Stenciloperation festgelegt, die abhängig vom Ausgang des Stencil- und des Z-Tests unterschiedlich eingestellt werden kann.

Anwendungen

Bearbeiten

Im einfachsten Fall wird durch den Stencilbuffer das Renderinggebiet begrenzt. Dies kann beispielsweise bei einer Auto- oder Flugsimulation zum Ausmaskieren des Cockpits genutzt werden, um die Teile der Szene, die sich hinter dem Cockpit befinden, nicht zu rendern. Ein anderes solches Einsatzgebiet ist die Vermeidung von Z-Fighting bei der Darstellung komplanarer Ebenen (Dreiecke). Mit Hilfe des Stencilbuffers lassen sich auch Spiegel darstellen, in dem die gespiegelte Szene in der originalen nur innerhalb des Spiegelrahmens gerendert wird.

Die enge Verzahnung des Stencil- und des Z-Buffers in der Grafikpipeline und insbesondere die Möglichkeit, die Inkrementierung oder Dekrementierung als Stenciloperation einstellen zu können, erlaubt aber auch die Implementierung einer Reihe komplexerer Verfahren. Eines der wichtigsten ist der Schattenvolumen-Algorithmus zur Erzeugung von Schatten von Punktlichtquellen. Verfahren dieser Art erfordern es meist, die Szene oder Teile der Szene mehrfach zu rendern, um Zwischenergebnisse im Stencilbuffer bei der Erzeugung eines Bilds sofort verwenden zu können. Daher beanspruchen sie die Grafikhardware in der Regel stark.

Geschichte

Bearbeiten

Den Stencilbuffer in der heutigen Form gibt es etwa seit Anfang der 1990er Jahre mit der Einführung der SGI Indigo von Silicon Graphics. Die erste Programmierschnittstelle, die den Stencilbuffer unterstützte, war das herstellereigene IRIS GL, gefolgt von OpenGL 1.0 im Jahre 1992. Direct3D enthält ab Version 6.0 Befehle zur Verwendung des Stencilbuffers.

Seit 1998 fand der Stencilbuffer Einzug in für den Spielemarkt konzipierte Grafikhardware, vor allem mit Erscheinen der Riva TNT von Nvidia und der Rage 128 von ATI. In allen neueren derartigen Produkten wird er seitdem ebenfalls unterstützt. Technisch belegen bei diesen Produkten bis heute der Stencil- und Z-Buffer den gleichen Speicherbereich auf der Grafikhardware, mit einer Größe von 32 Bit pro Pixel. Der Z-Buffer hat dabei eine Tiefe von 24 Bit pro Pixel, für den Stencilbuffer fallen die restlichen 8 Bit pro Pixel ab.

Bearbeiten