Stencil Buffering ist
eigentlich nichts Neues, sondern eine
in der OpenGL - Welt schon lange bekannte
Standard - Technik. Während dieses
Hardware - Feature in der Grafikkartenindustrie
für Spielebeschleuniger langsam aber
sicher zum Standard avanciert, tauchten
auch die ersten Demoversionen von
Spielen auf, welche davon Gebrauch
machen. Bereits 1998 demonstrierte
Creative Labs (die mit dem Sound Blaster
...) anhand einer angepassten Unreal
- Version erste mögliche Effekte mit
Stencil Buffern anhand der hauseigenen
TNT - Karten. Obwohl Creative Labs
ankündigte, diesen Patch auch für
andere TNT - Karten zu veröffentlichen,
blieb dieser Schritt bis heute aus.
Auch sonst blieb dem
Stencil Buffer bis jetzt der grosse
Durchbruch als Killer - Feature aus.
Quake III Arena (Q3A) der Spieleschmiede
id software, Expandable von Rage Software
sowie Unreal Tournament (UT) von EPIC
Megagames sind drei prominente Beispiele
für Spiele, welche den Stencil Buffer
optional nutzen. Obwohl der Stencil
Buffer angesichts neuer Schalgworte
wie "Enviromental Bump Mapping", T&L
oder "T-Buffer" etwas an Aufmerksamkeit
verloren hat, widmen wir uns einem
Blick hinter die Kulissen, um auch
wirklich zu wissen, von was hier überhaupt
die Rede ist und was für Effekte möglich
sind.
Stencil Buffer wortgenau
Das Wörtchen 'Buffer'
verrät es bereits, der Stencil Buffer
ist im Grunde genommen ein weiterer
für den Grafikchip nutzbarer Speicherbereich,
wie dies der z-Buffer für Tiefenwerte
und der Framebuffer für Farbwerte
ist. In der Tat werden die Stencil
- Werte zusammen mit den Tiefenwerten
(z-Werte) gespeichert, die z-Werte
belegen die ersten 24bits eines Words
(gängige Packetgrösse bei Computern),
die Stencil - Buffer - Werte die übrigen
8 bits.

Stencil heisst
in der sinngemässen deutschen Übersetzung
Schablone oder Maskierung, was
darauf schliessen lässt, dass man
bestimmten Bereichen des Bildes, ja
sogar einzelnen Pixeln, bestimmte
Werte zuweisen kann. Bildlich gesprochen
hängt man jedem Pixel einen kleinen
Notizzettel dran, auf dem sich
die 3D - Engine bzw. der 3D - Chip
bestimmte Dinge "notieren" kann. Zugänglich
ist der Stencil Buffer in OpenGL und
Direct3D ab Version 6. Der Funktionsumfang
in beiden APIs ist derselbe. Wir wollen
nun ein paar mögliche Effekte des
Stencil Buffers genauer unter die
Lupe nehmen.
1-bit Stencil Buffer
1 bit ermöglicht zwei
Zustände, 1 oder 0, oder in unserem
Fall sichtbar oder unsichtbar. Somit
kann man zu jedem Pixel zusätzlich
zu den 24bit z-Buffer - Werten einen
weiteren Wert, eben 0 oder 1, zuweisen.
Was kann ich nun damit machen? Uns
sind zwei mögliche Anwendungen eines
1bit - Stencil Buffers bekannt:

Unnötige Arbeit verhindern
Man stelle sich ein
etwas komplexeres Cockpit vor, z.B.
jenes eines Hubschraubers, wo man
oben und normalerweise unten zum Fenster
herausschauen kann, während etwas
unter der Mitte die Instrumentenkonsole
die Sicht nach drausen verdeckt. Für
den Spielprogrammierer wäre es äusserst
mühsam, hier das Bild aufzutrennen
und die oberen und unteren Bereiche
getrennt zu betrachten, er will lieber
die ganze Umgebung zusammen betrachten.
Da fast ein Drittel des Bildes wieder
verdeckt würde, müsste die Grafikkarte
unnötig viel rendern und die 3D-Engine
unnötig viele Bereiche erneuet berechnen,
denn das 2D-Bild, welches das Cockpit
und die Fensterstäbe darstellt, würde
über bereits gerenderte Bereiche gelegt.
Wenn man nun die entsprechenden Bereiche
mit einem Stencil Buffer maskiert,
könnte man so dem 3D-Chip einiges
an Arbeit ersparen. Diejenigen Bereiche,
welche nicht berechnet werden müssen,
da sowieso ein 2D - Bild darübergelegt
wird, erhalten den Stencil - Wert
0, dort, wo man durch das Fenster
nach draussen sehen kann, setzt man
den Stencil - Wert auf 1. Dreiecke,
welche sich in dem Bereich mit den
0 - Werten befinden, werden erst gar
nicht betrachtet. Von den Dreiecken,
welche betrachtet werden, werden desweiteren
nur die Pixel betrachtet, bei denen
der Wert auf 1 ist. Der Stencil Buffer
erfüllt hier eine ähnliche Aufgabe
wie der z-Buffer, der dasselbe für
übereinandergelegte Dreiecke übernimmt
('Hidden Surface Removal'
Fadeeffekt
Das Überblenden von
zwei bewegten Szenen (Dissolve) ist
ein weiterer Effekt, der mit einem
1bit - Stencil Buffer (und natürlich
auch mit einem 8bit - Stencil Buffer)
möglich ist. Dieser Effekt ist auch
etwas spektakulärer als oben erklärte
Arbeitsoptimierung. Allerdings kann
ich euch kein 3D - Spiel nennen, das
einen solchen Effekt verwendet, obwohl
dieser sicher recht nett aussehen
würde, dern Nutzen allerdings zugegebenermassen
etwas gering wäre. Einige ältere 2D
- Games wie Micro Machines machen
allerdings davon Gebrauch
Man berechne zwei verschiedene
Szenen gleichzeitig. Die eine Szene
ist noch nicht sichtbar, d.h. alle
Stencil - Buffer Werte der sichtbaren
Szene seien auf 1, jene der unsichtbaren
seien auf 0. Nun beginnt man mit dem
Fading. Man beginne, ein kleines Raster
auf dem sichtbaren Bild durch 0en
zu erstetzen und ersetze dieselben
Werte auf dem noch unsichtbaren Bild
durch 1en. Da immer die Bereiche mit
Stencil - Wert 1 in den Bildspeicher
geschrieben werden, erscheint langsam
die bisher nicht sichtbare Szene -
beide Szenen bleiben wohlgemerkt in
Bewegung! Nun weite man das Raster
aus und flippe immer mehr Stencil
- Werte bis die eine Szene völlig
verschwunden ist und die neue Szene
das ganze Bild einnimmt. Zugegeben,
dies wäre etwas anspruchsvoll für
die Hardware, da einerseits die 3D-Engine
des Spiels alles doppelt berechnen
muss und andereseits die Bandbreite
der 3D - Hardware aufgrund des massiven
Gebrauchs des Stencil Buffers belastet
wird, aber es wäre eine mögliche Anwendung
eines 1 - bit - Stencil Buffers.

Soweit zwei Beispiele
eines 1 bit - Stencil Buffers. Ich
bin mir sicher, dass damit noch mehr
Effekte möglich sind, doch bin ich
nun mal kein kreativer Spieleentwickler
und somit fallen mir auch keine weiteren
Anwendungsmöglichkeiten ein. Doch
was, wenn die Speichertiefe etwas
höher schrauben? weiter
zurück