Upload
godafrid-nansel
View
219
Download
0
Embed Size (px)
Citation preview
Stefan Röttger Universität Stuttgart (VIS)
Überblick
1. Motivation2. Shadow Volumes [Crow77]3. Verfahren ohne Stencil Buffer4. Demonstrationsfilm
MotivationShadow Volumes:+ dynamische Schattenberechnung in Echtzeit+ Nutzung der Grafikhardware (Stencil Buffer)Problem: Einschränkung auf neuste PC Grafikkarten
(z.B. kein Stencil Buffer auf der Voodoo 3)NEU: Benutzung des Screen Buffers als ErsatzDAMIT: Lauffähig z.B. ab Voodoo 1 !
Shadow Volumes
Schritt 1: Szene rendern Z-Werte
Shadow Volumes
Vorderseite: +1
Schritt 2: Shadow Volume Seiten rendern
Rückseite: -1
Shadow Volumes
Vorderseite: ±0 (Tiefentest)Rückseite: ±0 (Tiefentest) = ±0
Shadow Volumes
Vorderseite: +1Rückseite: ±0 (Tiefentest) = +1
±0
Shadow Volumes
Vorderseite: +1Rückseite: -1 = ±0
±0+1
Shadow Volumes
±0+1±0
Shadow Volumes• Wiederholung mit allen schattenwerfenden
Objekten• Pixel mit Stencil Buffer Wert > 0 schwarz färben• Szene erneut rendern um ambienten
Beleuchtungsanteil hinzuzufügen• Oder Helligkeitswerte im Schatten halbieren
Verfahren ohne Stencil BufferIdee: Die Schattenmaske wird im Screen Buffer
(RGB- oder Alpha-Kanal) berechnet, anstatt im Stencil Buffer
Problem: dstColor = dstColor -1 nicht realisierbar
Lösung: Anstatt +1 : *2 (verdopple Farbwert)Anstatt -1 : /2 (halbiere Farbwert)
Blendingfunktionen für *2, /2Farbwerte: 0 schwarz 1 weissweiss
Blendingfunktionen:
cdst=f*csrc + g*cdst
*2: f=cdst, csrc=1, g=1 cdst = cdst*1 + 1*cdst
/2: f=0, g=0.5 cdst = 0 + cdst*0.5
Zustand eines PixelsInitialisiere alle Pixel mit Farbwert 1/4
1/4 1/2 1
*2
/2
*2
/2
*2 (Clamping!)
„Eingabefolgen“:
Punkt in Shadow Volume: *2
Punkt vor Shadow Volume:
Punkt hinter Shadow Volume: *2 , /2
„Normierung“ auf 0/1Nach dem Rendern aller Shadow Volumes:
1/4 1/2 1
*2
1/2
1/2
1
1
0
0
*2
Licht Schatten
Invert(c:=1-c)
Anwendung der Schattenmaske• Multipliziere s/w Schattenmaske mit Bild:
Rendern der Szene, mit cdst = cdst * csrc
• Szene erneut rendern um ambienten Beleuchtungsanteil hinzuzufügen mit cdst = cdst + csrc
• Oder alternativ die Werte im Schatten halbieren mit Normierung auf 0.5/1 und cdst = cdst * csrc
Beispiel: Shadow Volumes
Beispiel: *2, Inv, *2
Beispiel: Fertiges Bild
Berechnung im Alpha Kanal• Alternativ kann kann die Schattenmaske auch im
Alpha Kanal berechnet werden• Angewendet wird die Schattenmaske durch
Umkopieren des Alpha Kanals in eine gleich große Textur
• Vorteil: Berechnung der Schattenmaske mit niedrigerer Auflösung möglich Schattenmaske wird schneller rasterisiert
• Szene muss bei Halbierung der Schattenwerte nicht noch einmal gerendert werden
Demonstrationsfilm
Zusammenfassung• Effiziente Schattenberechnung auch ohne
Stencil Buffer möglich• Schattenmaske wird im Screen Buffer (oder im
Alpha Kanal) aufgebaut• Verwende *2, /2 anstatt +1, -1• Durch anschließendes Umkopieren in eine
Textur kann die Schattenmaske auch in kleineren Auflösungen berechnet werden
• Wende die Schattenmaske nach Normalisierung an: ambiente Beleuchtung, schwarze Schatten, Helligkeit halbieren
Fin
Fragen?