Reflexionen & andere
dreckige Tricks
Desweiteren kann man
Stencil Buffers sehr gut zur Erzeugung
von Reflexionen einsetzen. Was ohne
Stencil Buffer zur Qual werden kann,
da sich das Objekt eventuell auch
an Stellen reflektiert, wo man es
gar nicht haben möchte, geht mit Stencil
Buffering ganz einfach. Man markiert
einfach diejenigen Polygone, auf welchen
das Spiegelbild sichtbar sein soll.

Pixel der Bodenpolygone
werden markiert, somit spiegelt sich
der Dino nur auf der Fläche anstatt
über den Rand hinaus in die Luft
Wendet man die Reflexion
rekursiv immer wieder an, kann
man sehr schöne "Spigelbild im Spiegelbild"
- Effekte erreichen. Dazu benötigt
man aber entsprechend mehr Stencil
Bits je nach gewünschter Reflexionstiefe
Volumerische Echtzeitschatten
und Reflexionen sind zwei Anwendungsmöglichkeiten
des 8bit - Stencil Buffers, kreativen
Spieleentwicklern dürften sicher noch
einige Tricks einfallen. Unter anderem
lassen sich damit auch ganz unstektakuläre
Dinge erledigen wie beispielsweise
das Messen der Tiefenkomplexität
in einem Spiel (Tiefenkomplexität
= Wieviel unnütze Arbeit pro Frame
erledigt wird / Wie oft ein Pixel
während dem Rendern übermalt wird,
bei Q3A ca. 3.5 - 4 mal). Weitere
Tricks mit Stencil Buffern wären die
Verhinderung von Polygonflackern (z-Fighting)
bei co - planarer Geometrie (Dreiecke
welche sich eigentlich auf derselben
Fläche befinden und abwechselnd erscheinen
und verschwinden) sowie berechenbare
Objekte (Constructive Solid Geometry,
z.B. Würfel geschnitten mit Kugel
oder andere aus der Mengenlehre bekannte
Operationen) oder auch "Leucht - Effekte"
(Halo Effekt), indem man das Objekt
mit Stencil Buffer zeichnet, vergrössert
und dann nochmals halbtransparent
dort zeichnet, wo keine Stencil -
Werte gesetzt sind.

Weitere Stencil Buffer
- Tricks (Z-Fighting verhindern, Halo
Effekt)
Features konkret: Wer
hat ihn - wer nicht
Folgende Chips bieten
einen Hardware - Stencil - Buffer:
- 3DLabs Permedia 3 (8 bit)
- ATi Rage 128 (8 bit)
- ATi Rage 128 PRO (8 bit)
- Bitboys Glaze3D (8 bit)
- Matrox G400 / G400 MAX (8 bit)
- nVidia RivaTNT (8 bit)
- nVidia RivaTNT2 / RivaTNT2
Ultra (8 bit)
- nVidia VANTA (8 bit)
- S3 Savage4 GT / Extreme / Pro
(8 bit)
- S3 Savage 3D (1 bit)
Man darf davon ausgehen,
dass sämtliche Chips, die nach diesen
hier aufgelisteten Chips angekündigt
werden, einen Stencil Buffer bieten.
3dfx - Karten bis und mit Voodoo 3 sowie
der PowerVR 250 (R.I.P?) bieten keinen
Stencil Buffer in Hardware. Beim Voodoo
3 hat 3dfx aber scheinbar in den OpenGL
- Treibern eine Emulation eingebaut
(siehe Screenshot aus Quake III Arena
Test).
Wer nutzt ihn?
Prinzipiell steht der
Stencil Buffer allen Direct3D 6 und
OpenGL - Entwicklern offen. Bisher haben
sich allerdings noch nicht so viele
für die Nutzung dessen entschlossen,
obwohl die dafür notwendigen Softwaretechniken
zumindest für OpenGL seit Jahren bekannt
sind. Die Entwicklung neuer 3D - Engines
verschlingt mitunter mehrere Jahre,
so dass die Softwaretitel mit der Unterstützung
der aktuellsten Features nur tröpfchenweise
erscheinen.
- EPIC Megagames Unreal Tournament
- id software Quake III
- ArenaRage Expendable
Hardwareanforderungen
Stencil Buffer - Effekte
gehen nicht immer ganz ohne Leistungsverlust
über die Bühne, wie dies manche Anpreisungen
vorgaukeln mögen. Neben der nötigen
Unterstützung eines Stencil Buffers
sollte man sich folgende Kombinationen
merken. Die meisten 3D-Beschleuniger
ermöglichen heute einen genauen
32bit z-Buffer. Beim gleichzeitigen
Einsatz des Stencil Buffers kann
man heute aber maximal 24bits für
den z-Buffer verwenden, da die
restlichen 8 bits dem Stencil Buffer
reserviert bleiben. Damit gilt das beim
Einsatz des Stencil Buffers immer
32bit's in den z-/Stencil Buffer
geschrieben werden, im Gegensatz
zu den 16bits welche normalerweise beim
z - Buffer verwendet werden. Damit verdoppelt
sich die nötige z-Buffer - Bandbreite.
Bei unserer Berechnung lassen wir allerdings
die gestiegene Z-Buffer Bandbreite beim
Schreiben des Z - Buffers einmal ausser
Betracht und beschränken uns lediglich
auf den reinen Aufwand durch Stencil
Buffers
Für Stencil Buffering
müssen zusätzliche Dreiecke von Chip
verarbeitet werden, zudem benötigen
Stencil Buffering Effekte zusätzliche
Bandbreite - das zur Zeit kostbarste
Gut auf einer 3D - Karte. Zusätzlich
zum Rendern der Schattendreiecke (Lesen
z-Buffer und Schreiben Stencil Buffer)
muss später erneut der ganze Stencil
Buffer gelesen werden (X - Auflösung
* Y - Auflösung * 8bit) sowie der Framebuffer
zusätzlich einmal gelesen UND geschrieben
werden. Bei der Annahme von 25% Schatten
auf dem Bildschirm käme somit folgende
vereinfachte Rechnung zustande:
- ( X - Auflösung * Y - Auflösung
* 8bit (=1 byte) * Schattenabdeckung
[0-100, Annahme 25%] * Overdraw
* Framerate * Anzahl berücksichtigter
Lichtquellen) [Stencil Buffer Schreiben]
+ ( X - Auflösung * Y - Auflösung
* 24bit (= 3 byte) * Overdraw *
Framerate * Anzahl berücksichtigter
Lichtquellen) [Z - Test]
d.h. bei 1024x768 und 30 fps:
- (1024 * 768 * 1 * 0.25 * 3.5 *
30/s * 1) + (1024 * 768 * 3 * 3.5
* 30/s * 1) = 268 MB /s
Schattenerzeugung:
Lesen Stencil Buffer,
Lesen Framebuffer, Schreiben Framebuffer
- X - Auflösung * Y - Auflösung
* 8bit + X - Auflösung * Y - Auflösung
* 32bit (4 byte) * Schattenabdeckung
* Framerate * 2
d.h. bei 1024x768 xTrueColor
und 30 fps:
- 1024 * 768 * 1 * 30/s + 1024 *
768 * 4 * 0.25 * 30/s * 2 = 70.77
MB/s
70.7 MB/s + 268 MB/s
= 338.7 MB /s.
Die Bandbreite für den
Stencil Buffer alleine erscheint somit
nicht sonderlich hoch, doch da eigentlich
alle 3D - Karten sowieso an der Grenze
des Speicherinterfaces arbeiten, können
diese zusätzlichen Daten durchaus ins
Gewicht fallen, vor allem bei Karten,
welche in Sachen Speicherbandbreite
sowieso unterdimensioniert sind (TNT
und Rage128 - Karten sowie viele normale
TNT2 - Karten). Der Hauptgrund für die
Leistungseinbusse ist auf die gestiegene
z-Buffer Bandbreite zurückzuführen und
nicht auf den Anteil des Stencil Buffers.
www.3dconcept.net
zurück