Volumetrische Stencilschatten

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Volumetrische Stencilschatten

Konzept

Bei dieser Technik nutzt man den (seit ~2000 von fast allen Grafikkarten angebotenen) Stencilpuffer um dort die im Schatten liegenden Bereiche der Szene abzulegen. Später werden dann mit einem passenden Stencilvergleich die Schatten dargestellt.

Dazu wird für jedes Objekt ausgehend von seiner Silhouette (es entsteht immer dort eine Silhouetten-Kante, wo ein dem Licht abgewandtes und ein dem Licht zugewandtes Dreieck sich treffen) durch extruhieren ihrer Eckpunkte (im Idealfall in die Unendlichkeit, am einfachsten lösbar über die W-Koordinate) ein Volumen erstellt das den Bereich des Objektes darstellt den es schattiert.

Grundlegende Funktionsweise

Um eine Szene mit volumetrischen Stencilschatten zu rendern sieht der Renderablauf im Normalfall wie folgt aus :

1. Szene nur mit ambientem Lichtanteil in den Farbpuffer rendern
2. Silhouette zwischen Objekten und Lichtquellen errechnen
3. Silhouetten extruhieren (und je nach Technik noch Deckel für das Volumen erstellen)
4. Stenciltest aktivieren und erstellte Schattenvolumen dort hinein rendern (mit unterschiedlichen Stenciloperationen für Vorder- und Rückseite)
5. Szene mit diffusem Lichtanteil rendern (da Schatten im Stencilpuffer liegen wird die Szene jetzt schattiert)

Methoden

zPass

Bei dieser (zuerst entwickelten) Methode inkrementieren nach vorne zeigende Dreiecke den Wert im Stencilpuffer, wenn diese den Test passieren; und nach hinten zeigende Dreiecke dekrementieren diesen Wert. Nachteil dieser Methode ist jedoch die Tatsache das es zu Fehlern beim Zählend der Schattenwerte im Stencilpuffer kommt, sobald der Betrachter in ein Schattenvolumen eintritt. Um dies zu lösen gibt es jedoch die zFail-Methode.

glCullFace(GL_FRONT);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP);
RenderShadowVolume;

glCullFace(GL_BACK);
glStencilOp(GL_KEEP, GL_KEEP, GL_DECR_WRAP);
RenderShadowVolume;

zFail

Die von John Carmack (ID-Software) im Jahre 2000 "erfundene" Methode zählt die Schattenfragmente etwas anders : Für nach vorne zeigende Dreiecke wird der Wert im Stencilpuffer inkrementiert, wenn diese den Test nicht bestehen (daher der Name); und dekrementiert für nach hinten zeigende Dreiecke. Weiterhin muss man bei dieser Methode (damit die Fragmente korrekt gezählt werden) ein geschlossenes Schattenvolumen erstellen, das neben der extruhierten (meist in die Unendlichkeit) Silhouette des schattenwerfenden Objektes sowohl einen vorderen Deckel (Front-Cap) als auch einen abschliessenden (Back-Cap) hat. Der große Vorteil (auf den man in den seltensten Fällen verzichten) kann ist hier die Tatsache das zFail auch dann korrekte Schatten darstellt wenn der Betrachter in das Volumen eindringt. Nachteilig ist aber das man bedingt durch Deckel und Boden für die Schattenvolumen mehr Berechnungen und Pixeltests durchführen muss. Im Normalfall findet man deshalb eine Kombination aus beiden Techniken in einer Anwendung (zPass generell, wenn Betrachter in einem Volumen ist, dann zFail).

Vor- und Nachteile

Positiv :
- Sehr hohe Details (kein Aliasing)
- Selbstschattierung für schattenwerfende Objekte

Negativ :
- Benötigt Kenntnis über die zugrundeliegende Geometrie (für die Schattensilhouette)  
- Silhouette muss auf der CPU errechnet werden (->CPU-Lastig)
- Verbraucht sehr viel Füllrate

Beispiel

Datei:shadowvolume scene.jpg
Zu sehen ist hier eine Szene die mittels volumetrischer Stencilschatten schattiert wurde. Die roten Umrandungen stellen die Silhouette der Szene ggü. der Lichtquelle dar, während die blauen Linien die Schattenvolumen darstellen (extruhiert in die Unendlichkeit).

Ressourcen

"The Mechanics of Robust Stencil Shadows -  Eric Lengyel"
"The Theory of Stencil Shadow Volumes - Hun Yen Kwoon"
"John Carmack zum Thema Shadow Volumes"