8-bit Stencil Buffer
Ein 8 - bit Stencil
Buffer ermöglicht nun nicht mehr nur
zwei zusätzliche Zustände pro Pixel,
sondern satte 256 (Da man mit 8 bits
2^8 verschiedene 0-1 Folgen erzeugen
kann), was detaillierte und knifflige
Effekte ermöglicht. Man kann zwar
alle 256 Zustände für einen einzelnen
Effekt verwenden, normalerweise teilt
man sich diesen 8bit-Bereich pro Pixel
jedoch auf, so dass man beispielsweise
1 bit für das zuerst beschriebenen
"Cockpit - Effekt" verwendet, 4 weitere
Bits für die sagenumwobene Schattenberechnung
und die restlichen 2 bits für einen
anderen kniffligen Trick. Mit einem
8 bit - Stencil Buffer steht der Kreativität
der Entwickler Tür und Tor offen.
Dissolves mit Transitions, Rendering
von Co-planaren Texturen, volumetrische
Schatten, Skid Marks, Scorch Marks
oder nette Reflexionseffekte.
volumerische Echtzeitschatten
Viele Schattenberechnungen
beschränken sich auf den Schattenwurf
auf eine planare Fläche und vernachlässigen
die Objekte, welche innerhalb dieses
Schattenwurfs auftauchen. Mit dem
Stencil Buffer kann man relativ einfach
auch Schattenwürfe auf diese Objekte
berücksichtigen. In unserem Fall kommt
der Stencil Buffer ganz am Schluss
der 3D-Pipeline zum Einsatz, wenn
bereits alles fertig gerendert
ist. Das heisst Wände mit Texturen,
Türen, Kisten, Monster und dergleichen
stehen bereits in der Gegend herum.
Eigentlich könnte man nun schon das
Frame darstellen - lediglich die Schatten
fehlen noch.
Für die Schattenberechnug
benötigt man Zugriff auf die Tiefenwerte
der einzelnen Pixel im z - Puffer.
Wir versetzen uns in die Position
der Lichtquelle(n) und "schauen" auf
die Szene. Nun erfordert die Schattenberechnung
quasi dieselben Schritte wie das Hidden
Surface Removal, nur mit dem Unterschied,
dass die 3D - Szene von der Lichtquelle
aus betrachtet wird und nicht vom
Standpunkt des Betrachters. Vom Standpunkt
der Lichtquelle aus werden somit die
(un-)sichtbaren Teile für die Lichtquelle
bestimmt. Alles, was die Lichtquelle
nicht "sieht", wird am Schluss mit
einem Schatten versehen.

Figur A: Schattenwurf
auf eine zum Dreieck paralelle Fläche
Die Schatten beginnen
wie im echten Leben an den Kanten
des Objekts und folgen der Geraden
von der Lichtquelle. Die erste Begrenzung
der möglichen Schatten wäre somit
festgestellt. Innerhalb dieser Begrenzungen
entsteht nun ein "Volumen", ein Raum
indem das einfallende Licht von einem
Objekt verdeckt wird. Aus der eben
durchgeführten Berechnung resultieren
in unserem einfachen Beispiel spezielle
"Schattendreiecke". Das erste Schattendreieck
hat die Eckpunkte A, B und C, das
zweite die Punkte A, C und D (siehe
Figur A). Die eben erzeugten "Schattendreiecke"
werden nun wieder an den 3D Chip geschickt.
Dieser berechnet deren Tiefenwerte,
um dann festzustellen, ob die im Framebuffer
befindlichen Pixel der gerenderten
Szene innerhalb der Schattenzone (grau)
liegen. Dazu wird mit einfachen
Grössenvergleichen lediglich überprüft,
ob der Tiefenwert (Z-Wert) des Pixels
im Framebuffer grösser als der Z-Wert
des Objekts und kleiner als der Tiefenwert
des Schattendreiecks ist. Falls ja,
so werden diese Pixel mit einer
Erhöhung des entsprechenden Stencil
Bits markiert. Nachdem dieser
Schritt für alle Lichtquellen und
Objekte abgeschlossen ist, blendet
man über die fertig gerenderte Szenerie
ein abgedunkeltes Viereck, dass jedoch
nur dort wirksam wird, wo die Stencil
Flags gesetzt wurden. Et voilà, die
Objekte sind mit "volumerischen" Schatten
versehen ...

Figur B: Schattenwurf
auf einen Würfel
Dies ist die billigste
und gebräuchlichste Form für volumerische
Schatten. Es gibt natürlich noch andere
Ansätze, welche aber aufwendiger und
damit langsamer sind:
Alternativ zum Überblenden
des Schattenbereiche mit einem dunklen
Viereck könnte man auch die entstprechendne
Pixel neu rendern lassen. Dies
hätte den Vorteil dass einige Nebel-
und Materialeffekte besser wirken
würden.
Ein ganz anderer Ansatz
wäre zuerst die Szene untexturiert
und unschattiert zu rendern und nur
die Tiefenwerte zu speichern,
dann die Schattendreiecke zu bestimmen
und dann die mit Stencil Bit markierten
Bereiche mit deaktiverten Lichtquellen
zu berechnen und dann die nicht markierten
Bereiche mit aktivierten Lichtquellen.
Diese Methode liefert die besten Resultate,
ist allerdings auch am aufwenigsten.
Mit einem 8 bit Stencil
Buffer sind maximal 8 Lichtquellen
möglich. Hätte man mehr als 8 Lichtquellen,
müsste man den ganzen oben beschriebenen
Vorgang mehrmals durchführen, was
natürlich an Leistung kostet und für
Games kaum mehr praktikabel ist.
|

volumerischer
Echtzeitschatten
|

Standardschatten
als grauer Fleck
|
Die hier beschriebenen
Schattenvolumen funktionieren am besten,
wenn das schattenwerfende Objekt
einfach gehalten ist. In den meisten
Games wird für die Schattenberechnung
die einfachste Variante des entsprechenden
Objekts gewählt, falls verschieden
komplexe Modellierungen vorliegen.
Je einfacher die Siluette, umso schneller
berechnen sich die Schatten - Räume.
Das Ende der Fahnenstange?
Zum Glück nicht. Echtzeitschatten
mit den geometrisch realistischen
Schattenwürfen auf Objekte sind zwar
ein netter Fortschritt, doch so ganz
realistisch wirken sie noch nicht.
Das neue Zauberwort heist Soft Shadows
und Soft Reflections.

Volumerische Echtzeitschatten
(links) und Softshadows (rechts)
Euch ist sicher schon
aufgefallen dass Schatten normalerweise
nicht so kantige Ränder haben wie
jene Schatten in Quake III Arena.
Sie verlaufen eher fliessend. Diesen
Effekt erreicht man auch mit einem
normalen Stencil Buffer, zumindest
ansatzweise, indem man zusätzlich
noch ein grösseres Schattendreieck
mit grösserem Transparezwertwert über
das "echte" Schattendreieck blendet.
Dies funktioniert allerdings nur bei
Schattenwürfen auf Mauern und Böden.
Nettere Effekte erreicht man da schon
mit Accumulation Buffers oder dem
"T-Buffer" von 3dfx, einer ähnlichen
Technik. Dazu verschiebt man jeweils
die Lichtquelle minim und rendert
mehrere Frames aus jeder Position
der Lichtquelle. Durch geschicktes
übereinanderblenden der einzelnen
Frames erhalten die Schatten weiche
Kanten.

Figur C: approximierte
"Soft Shaodows" ohne Variation der
Lichtquelle: Überblenden verschieden
skallierter Schattenvolumes mit unterschiedlichen
Transparenztwerten
weiter
zurück