Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
SchattenSchatten
13. VorlesungPhotorealistische ComputergrafikPhotorealistische Computergrafik
Thorsten GroschThorsten Grosch
Warum SchattenWarum SchattenMit SchattenMit Schatten
Höherer RealismusAbstände können besser eingeschätzt werdenGl b l B l h Si h b k iGlobale Beleuchtung: Sichtbarkeitstest
Warum sind Schatten mit OpenGL kompliziert ?Warum sind Schatten mit OpenGL kompliziert ?OpenGL besitzt lokales Beleuchtungsmodell, d.h. zu einem Zeitpunkt ist immer nur ein Polygon bekannt. Für dieses Polygon wird ein einfaches Beleuchtungsmodell angewendetwird ein einfaches Beleuchtungsmodell angewendet.Für Schatten müssten alle anderen Polygone bekannt sein
• Jedes andere Polygon könnte einen Schatten auf das kt ll P l faktuelle Polygon werfen
Es gibt kein glEnable(GL_SHADOW)…
T.Grosch - 2 -
Verschiedene SchattentypenVerschiedene Schattentypen
LightmapsLightmapsStatische Schatten in Textur
Schwarze Flecken unter SpielfigurSchwarze Flecken unter Spielfigur
In dieser VorlesungPlanare SchattenPlanare SchattenShadow VolumesShadow Maps
T.Grosch - 3 -
Planare Schatten ⎞⎛Planare Schatten
Skalierung y = 0 ⎟⎟⎟⎞
⎜⎜⎜⎛
010000000001
Skalierung y = 0 Nur paralleles Licht von oben ⎟⎟
⎟
⎠⎜⎜⎜
⎝ 10000100
Jim Blinn ´78: Me and my (fake) shadowPunktlicht an beliebiger PositiongEckpunkte Schatten = Schnittpunkt von Gerade durch Eckpunkt und Lichtquelle mit Ebene
(Lichtposition)l
(Eckpunkt)
(projizierter Punktin xz-Ebene)
v
v′
T.Grosch - 4 -
Blinn´78 : Me and my (fake) shadowBlinn 78 : Me and my (fake) shadowy
ll
yy vl − y
xx
yy
xx
llv
vllv −′=
−−
xx lv −v
lyxxy
x lvlvl
v−
=′⇒
xxx lv −′
ylv′
yyx vl −
yzzy vlvlv
−=′ (analog)
⎞⎛ ll 00
yyz vl
v−
= (analog)
Darstellung als Matrix
⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
−
−
=
xy
ll
ll
M00000000
T.Grosch - 5 -
⎟⎟⎠
⎜⎜⎝ − y
yz
lll010
00
Schattenmatrix mit OpenGLSchattenmatrix mit OpenGL⎟⎞
⎜⎛ −
⎞⎛⎞⎛⎞⎛ 00yxyx vllv
vllvvll
⎟⎟⎟⎟⎟
⎜⎜⎜⎜⎜
−
−
→⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
+−
−
=⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
⋅⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
−
−
0000000000
yzzy
yy
zyyz
yxyx
z
y
x
yz
xy
vlvl
vl
vlvl
vllv
vvv
ll
ll
⎟⎟⎟
⎠⎜⎜⎜
⎝
−⎟⎟⎠
⎜⎜⎝ +−⎟⎟
⎠⎜⎜⎝⎟
⎟⎠
⎜⎜⎝ −
11010 yy
yy
yy
zyyzz
y
yz
vllvl
glLoadIdentity();gluLookAt(from at up);
glLoadIdentity();glColor3f(0 0 0);gluLookAt(from,at,up);
// transform geometry// draw geometry…
glColor3f(0,0,0);gluLookAt(from,at,up);glMultMatrix(M);// transform geometry… // transform geometry// draw geometry
Schatten auf beliebige Ebene: siehe Red Book
T.Grosch - 6 -
Ebene: siehe Red Book
Richtige SchattenRichtige Schatten
Nur planare EmpfängerflächeNur planare EmpfängerflächeKeine Selbstverschattung
Gängige Verfahren für SchattenShadow VolumesShadow VolumesShadow Mapping
Kein Verfahren ist besser als das andere, beide haben Vor – und Nachteile
T.Grosch - 7 -
Shadow VolumesShadow VolumesFranklin Crow ´77Franklin Crow 77Idee: Schattenvolumen hinter ObjektAlle Objekte im Schattenvolumen sind im Schatten, alles außerhalb nicht
Konstruktion Schattenvolumen:Konstruktion Schattenvolumen:Finde SiIhouette des Objekts
aus Sicht der Lichtquelleund verlängere Silhouette
Schattenvolumenund verlängere Silhouette
T.Grosch - 8 -
Shadow VolumesShadow VolumesAnwendung auf Grafik Hardware (Stencil Buffer)Anwendung auf Grafik Hardware (Stencil Buffer)
Zeichne Seiten des SchattenvolumensZähle Schnittpunkte von Betrachter aus mit Schattenvolumen
1 b i Ei i 1 b i A i+1 bei Eintritt, -1 bei Austritt
Objekte im Schatten-1 0
Objekte im Schattenhaben einen Zählwert > 0
+1
1+1
+1
T.Grosch - 9 -
Shadow Volume im 3DShadow Volume im 3D
Einige Kanten der Geometrie sind SilhouettenkantenEinige Kanten der Geometrie sind Silhouettenkanten
(Bild S.Brabec)
T.Grosch - 10 -
SilhouettenkantenSilhouettenkantenSilhouettenkante: Ein Polygon ist zur Lichtquelle gedreht, das andere Polygon
lv
v
Voraussetzung 1: Geschlossenes Polygonmodell
von der Lichtquelle abgewandt
nv
v
yg(2-manifold)
0>lnvov
0<lnvov
: zur Lichtquelle gedreht
: von der Lichtquelle abgewandt
Silhouettentest in SoftwareDatenstruktur für Polygon, jedes Polygon speichert Liste der yg , j yg pNachbarpolygone
Die Verlängerung der Silhouettenkanten ergibt die Seiten des Schattenvolumens
T.Grosch - 11 -
SilhouettenkantenSilhouettenkantenDreiecke (A,B,C) und (A,D,B)
nv
Voraussetzung 2: Konsistente Orientierung
A C
Dreiecke (A,B,C) und (A,D,B)Konsistente Orientierungder Eckpunkte jedesPolygons (z.B.
B
DVorderseite immer gegen der Uhrzeigersinn)
(Unendliche) Verlängerung der Silhouettenkanten:Suche Polygon P1, das zur Lichtquelle zeigt
A C
yg q gSuche Nachbarpolygon P2, das von Lichtquelle abgewandt istFalls die Kante als bei P1 eingetragen ist
B
DA´),( 10 vvFalls die Kante als bei P1 eingetragen ist,
dann ist eine korrekt orientierte Seite des Schattenvolumens
A),,,( 1100 vvvv ′′
),( 10 vv
T.Grosch - 12 -
B´(A,A´,B´,B)
Verlängerung SilhouettenkanteVerlängerung SilhouettenkanteZeichne Viereck ),,,( 1100 vvvv ′′
Schattenvolumen soll nicht sichtbar sein:Zeichnen nur im Stencil Buffer
Silhouettenkante
0v1v
Zeichnen nur im Stencil Buffer
1
SchattenkanteSchattenkante(entsteht durch z-Buffer)
0v′1v′
T.Grosch - 13 -
1
Shadow Volume SchritteShadow Volume Schritte6 Backface Culling aktivieren1. Geometrie zeichnen 6. Backface Culling aktivieren7. Schattenvolumen zeichnen(Durch Backface Cullingwerden nur die Vorderseiten des
2. Stencil Buffer mit 0 löschen3. Color Buffer abschalten4. z-Buffer auf Read Only stellen
Schattenvolumens gezeichnetund der Stencil Buffer an diesenStellen um eins erhöht)
5. Stencil Buffer so einstellen,daß beim zeichnen eines P l di i htb
)
+1+1
Polygons die sichtbarenBereiche um eins erhöht werden
0
T.Grosch - 14 -
Shadow Volume SchritteShadow Volume Schritte9. Frontface Culling aktivieren10. Schattenvolumen zeichnen(Nur Rückseiten des Schattenvolumens werden
i h t
8. Stencil Buffer so einstellen,daß beim zeichnen eines Polygons die sichtbaren
gezeichnetund der Stencil Buffer an diesenStellen um eins erniedrigt)
Bereiche um eins erniedrigt werden
-1-1
0
T.Grosch - 15 -
Verlängerung SilhouettenkanteVerlängerung SilhouettenkanteÜberlagerung: Im Stencil Buffersteht überall im Schattenbereichsteht überall im Schattenbereich ein Wert > 0
11 z Buffer deaktivieren11. z-Buffer deaktivieren, Color Buffer aktivieren 12. Verwende Stencil Buffer alsMaske und zeichneMaske und zeichne bildschirmfüllendes, schwarzesRechteck
+10
T.Grosch - 16 -
Warum z Buffer Read-Only ?Warum z Buffer Read-Only ?
1+1 +1
0
-1-10
Die Seiten des Schattenvolumens werden teilweise von der Geometrie verdeckt ->
Falls der z-Buffer einfach aktiviertbleibt werden die Rückseitenteilweise von der Geometrie verdeckt >
Schattenkanten entstehenOhne z-Buffer wären z.B. keineSchattenkanten auf dem Boden
bleibt werden die Rückseitennicht gezeichnet, da von den
Vorderseiten verdeckt ->z-Werte dürfen nicht überschrieben werden
+10z-Buffer Read-Only: Schatten hat gleichen Tiefenwert
wie Geometrie
T.Grosch - 17 -
Schattenvolumen von der Seite betrachtetSchattenvolumen von der Seite betrachtetBeispiele
+1 1 +1 1+1 -1 +1 -1
+10 0+10 0
+10 0 +1 +2 +10 0
Betrachter schaut durchs Schattenvolumen durch:Betrachter schaut durchs Schattenvolumen durch:# Eintrittspunkte = # Austrittspunkte
Betrachterstrahl bleibt im Schattenvolumen hängen:# Eintrittspunkte > # Austrittspunkte
T.Grosch - 18 -
Varianten für hellen SchattenVarianten für hellen SchattenSchnell: Genauer:Zeichne Szene komplett beleuchtetGeneriere Schattenmaske
Genauer:Zeichne Szene nur mit ambientem LichtGeneriere SchattenmaskeGeneriere Schattenmaske
Aktiviere Alpha Blending (SRC_ALPHA, ONE MINUS SRC ALPHA)
Generiere Schattenmaske in Stencil BufferZeichne Szene mit diffusem & spekularemONE_MINUS_SRC_ALPHA)
Zeichne bildschirmfüllendes, schwarzes Rechteck mit
diffusem & spekularem Licht (falls Stencil == 0)
schwarzes Rechteck mit Farbe (0,0,0,alpha)
Schatten wird abgedunkelt
Schatten hat nur ambientes LichtGlanzlichter liegen im Schatten wird abgedunkelt,
falls Stencil > 0
gSchatten und werden nicht einfach abgedunkelt
T.Grosch - 19 -
Optimierung bei transformierter GeometrieOptimierung bei transformierter Geometrie1−M Zur Erkennung, ob ein Polygon
zur Lichtquelle zeigt oder abgewandt ist, wird nicht jedes
Dreieck mit der Modelview Matrix transformiert sondern
MMatrix transformiert, sondern nur einmal die Lichtquelle mit
der inversen Modelview Matrix transformiert.
Geometrie durch Modelview Matrix M transformiert Lichtquelle durch inverse
Modelview Matrix transformiert
T.Grosch - 20 -
Probleme mit Shadow VolumesProbleme mit Shadow Volumes
Near Clipping PlaneNear Clipping PlaneDurch near-Clipping Plane fehlt die Vorderseite des Schattenvolumensnear
+1 -1Zähler ist falsch, 0 statt +1
Abhilfe: near Wert klein wählenAchtung: z-Buffer wird ungenau
V i t fü k kt S h tt0
Variante für korrekten Schatten, wenn Betrachter im Shadow Volume:zFail Shadow Volumes[Bilodeau & Songy 1999][Carmack 2000][Bilodeau & Songy 1999][Carmack 2000]
1. Zeichne Rückseiten mit +12. Zeichne Vorderseiten mit -13. Setze dabei z-Buffer Vergleich auf >=
T.Grosch - 21 -
3. Setze dabei z Buffer Vergleich auf
Beispiele Shadow VolumesBeispiele Shadow Volumes
Doom 3nVIDIA
T.Grosch - 22 -
Vorteile / NachteileVorteile / NachteileShadow Volumes Vorteile
Scharfe Schattenkanten, kein AliasingPunktlichtquellen, nicht nur Spots
Shadow Volumes NachteileDatenstruktur für Zusammenhang zw. Polygonen muß aufgebaut werdenwerdenNur geschlossene ModelleLangsam bei komplexer Geometrie
A f ä di S h h Silh tt k t (CPU)• Aufwändige Suche nach Silhouettenkanten (CPU)• Viele Seiten des Schattenvolumens werden gezeichnet, hohe
Füllrate erforderlichProblem falls Betrachter im SchattenProblem falls Betrachter im SchattenZählerüberlauf im (8 Bit) Stencil Buffer möglichTexturen mit Alpha = 0 (Billboards)
T.Grosch - 23 -
Erweiterungen zu Shadow VolumesErweiterungen zu Shadow Volumes
Weiche Schatten mit mehreren PunktlichtquellenWeiche Schatten mit mehreren Punktlichtquellen [Brotman & Badler 1984]
Offene Modelle, nichtplanare Polygone [Bergeron 1986]
Betrachter im Shadow Volume [Bilodeau & Songy 1999][Carmack2000]
W i h S h tt k tWeiche Schattenkanten [Assarson et al. 2002 - 2004]
Shadow Volumes komplett auf der Grafik Hardware [Brabec et al 2003][Brabec et al. 2003]
Reduktion unnötiger Seiten des Schattenvolumens [Lloyd et al 2004]
Hierarchical Occlusion Culling [Stich et al. 2007]
T.Grosch - 24 -
Shadow Mapping (Williams ´78)Shadow Mapping (Williams 78)
Idee: Tiefenwerte aus Sicht der Lichtquelle in TexturIdee: Tiefenwerte aus Sicht der Lichtquelle in Textur speichernÜber Vergleich Echter Tiefenwert – Tiefenwert ausÜber Vergleich Echter Tiefenwert Tiefenwert aus Textur ermitteln ob Schatten oder nichtVorstufe: Projektive Texturenj
(Bild W. Heidrich)
T.Grosch - 25 -
( d e d c )
Projektive TexturenProjektive TexturenEin Projektor wirft ein Bild an die WandEin Projektor wirft ein Bild an die Wand
Das Bild soll mit einer Textur dargestellt werdenWie müssen die Texturkoordinaten gesetzt werden ?
Idee: OpenGL Projektionen
⎟⎞
⎜⎛
⎟⎞
⎜⎛ xs
0,1 1,1
p jverwenden
Textur:
⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
•=⎟⎟⎟⎟⎞
⎜⎜⎜⎜⎛
zyx
Mrts
0,0 1,0
tTextur:
Soll auf Geometrie projiziert werden
⎟⎟⎠
⎜⎜⎝
⎟⎟⎠
⎜⎜⎝ 1q
s
Matrix für Umrechnung
T.Grosch - 26 -
gWeltkoordinate in Texturkoordinate
Projektive TexturenProjektive TexturenMatrixaufbau
Evtl. ModelingMatrix
Matrixaufbau
⎟⎞
⎜⎛
⎟⎞
⎜⎛
⎟⎞
⎜⎛⎟
⎟⎟⎞
⎜⎜⎜⎛
⎟⎞
⎜⎛
LightLight112100
21
xs
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝
•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•
⎟⎟⎟⎟
⎜⎜⎜⎜
=
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝ 1MatrixLookAtLight
MatrixProjectionLight
21
2100
210
210
zy
qrt
⎠⎝⎟⎟
⎠⎜⎜
⎝⎠⎝ 1
100022q
U h i
Division durch4. Komponente:
0..w -> 0..1Umrechnung in
ProjektorkoordinatengluLookAt(lightPos, lightAt, lightUp)
Umrechnung -w..+wnach 0..w(Viewport)
ProjektionsmatrixgluPerspective(lightAngle aspect near far)
(Viewport)
T.Grosch - 27 -
gluPerspective(lightAngle, aspect, near, far)
Projektive TexturenProjektive Texturen
⎟⎞
⎜⎛
⎟⎞
⎜⎛
⎟⎞
⎜⎛⎟
⎟⎟⎞
⎜⎜⎜⎛
⎟⎞
⎜⎛ xs
LightLight112100
21
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝
•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•
⎟⎟⎟⎟
⎜⎜⎜⎜
=
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝ wzy
qrt
MatrixLookAtLight
MatrixProjectionLight
21
2100
210
210
⎠⎝⎟⎟
⎠⎜⎜
⎝⎠⎝ wq
100022
Projektion verändert homogene Koordinate:Projektion verändert homogene Koordinate:Echte Texturkoordinaten (s/q, t/q)
Ti f i d i h t i /Tiefe wird gespeichert in r/q
T.Grosch - 28 -
Projektive Texturen mit OpenGLProjektive Texturen mit OpenGLfloat genS[] = { 1.0f, 0.0f, 0.0f, 0.0f };g [] { , , , };glEnable( GL_TEXTURE_GEN_S );glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL EYE LINEAR );
xs =GL_EYE_LINEAR );glTexGenfv( GL_S, GL_EYE_PLANE, genS );
Entsprechend für T,R,Qfloat genT[] = { 0.0f, 1.0f, 0.0f, 0.0f };
⎟⎟⎞
⎜⎜⎛
⎟⎟⎞
⎜⎜⎛ xs
…
Texturgenerierung wird aktiviert ⎟⎟⎟⎟
⎠⎜⎜⎜⎜
⎝
=
⎟⎟⎟⎟
⎠⎜⎜⎜⎜
⎝ wzy
qrt
Texturkoordinate = EckpunktkoordinateOpenGL hat nur planare Projektionen für Texturkoordinaten
Projektion nur über Texturmatrix
⎠⎝⎠⎝ wq
T.Grosch - 29 -
Projektive Texturen mit OpenGLProjektive Texturen mit OpenGLTexturmatrix setzen
glMatrixMode(GL_TEXTURE);glLoadIdentity();glLoadIdentity();glTranslatef(0.5f, 0.5f, 0.5f);glScalef(0.5f, 0.5f, 0.5f);gluPerspective(lightAngle 1 0f lightNear lightFar);gluPerspective(lightAngle, 1.0f, lightNear, lightFar);
gluLookAt(lightFrom[0], lightFrom[1], lightFrom[2], lightAt[0] lightAt[1] lightAt[2]lightAt[0], lightAt[1], lightAt[2],lightUp[0], lightUp[1], lightUp[2]);
T.Grosch - 30 -
Shadow MapsShadow Maps
Idee: Kamera in Lichtquelle setzenIdee: Kamera in Lichtquelle setzenz-Buffer von Lichtquelle aus in Textur kopierenProjektives Texturmapping mit TiefentexturProjektives Texturmapping mit TiefentexturPro Pixel echten Abstand mit Abstand aus Textur vergleichenvergleichen
T.Grosch - 31 -
Shadow MapsShadow Maps
Kamera in Lichtquelle setzen, z-Buffer auslesen
Depth-Texture von Lichtquelleaus projizierenp j
Schatten eines Spotlightsaus Tiefenwerten bestimmen
T.Grosch - 32 -
Shadow Maps ZA: Z Wert in Textur an (s/q, t/q)Shadow Maps ZA: Z Wert in Textur an (s/q, t/q)ZB: Z Wert in Licht Koordinatensystem (r/q)
Az
z Az BzBz A B
BA zz <
PBA zz =
P
BA zz <
P ist im SchattenP wird beleuchtet
Z d Z li i B i h [0 1] d
T.Grosch - 33 -
ZA und ZB liegen im Bereich [0,1] undsind nicht-linear transformiert
Noch mal als ErinnerungNoch mal als Erinnerung….In der Texturmatrix steht eine Art „nachgebaute“ OpenGL Pipeline:
⎟⎞
⎜⎛
⎟⎞
⎜⎛
⎟⎞
⎜⎛⎟
⎟⎟⎞
⎜⎜⎜⎛
⎟⎞
⎜⎛ xs
LightLight112100
21
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝
•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•⎟⎟⎟
⎠
⎞
⎜⎜⎜
⎝
⎛•
⎟⎟⎟⎟
⎜⎜⎜⎜
=
⎟⎟⎟⎟⎟
⎠⎜⎜⎜⎜⎜
⎝ wzy
qrt
MatrixLookAtLight
MatrixProjectionLight
21
2100
210
210
⎠⎝⎟⎟
⎠⎜⎜
⎝⎠⎝ wq
100022
ModelviewProjecion
Viewport für Textur
Deshalb gilt:1. Unter den Texturkoordinaten (s/q, t/q) steht die Pixelposition des
p
Weltpunkts (x,y,z,w)2. In r/q steht die Tiefe des Weltpunkts (x,y,z,w) in Lichtkoordinaten
Die persp Division wird hier erst nach der Viewport
T.Grosch - 34 -
Die persp. Division wird hier erst nach der Viewport Transformation durchgeführt,
Dies ändert aber nichts am Ergebnis (Beweis Übung)
TiefenvergleichTiefenvergleich
Genaue Beschreibung:Genaue Beschreibung:Interpolierte Texturkoordinaten (s/q, t/q, r/q) ermitteln (passiert automatisch)Texturpixel an Stelle (s/q, t/q) auslesen: Tiefenwert aus Sicht der Lichtquelle (ZA)3 Komponente der Texturkoordinate r/q entspricht dem z3. Komponente der Texturkoordinate r/q entspricht dem z-Wert im Koordinatensystem der Lichtquelle (ZB)Vergleich der Tiefenwerte:
• ZA = ZB : Licht• ZA < ZB : Schatten
T.Grosch - 35 -
Shadow Map anlegenShadow Map anlegenglGenTextures(1, &shadowMapID);glGenTextures(1, &shadowMapID);glBindTexture(GL_TEXTURE_2D, shadowMapID);
lC T I 2D(GL TEXTURE 2D 0 GL DEPTH COMPONENTglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, shadowResolution, shadowResolution, 0 );
Direkte Kopie von z-Buffer in Textur (kein Umweg über Hauptspeicher)Oder: FrameBufferObject verwenden
T.Grosch - 36 -
Vergleichsfunktion aktivierenVergleichsfunktion aktivieren
glTexParameteri(GL TEXTURE 2D GL TEXTURE COMPARE MODEglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
Inhalt von Textur mit r Komponente der Texturkoordinate vergleichen
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
Vergleichsfunktion setzen: r/q <= texture(s/q, t/q) ?Vergleich erfolgreich: Als Texturwert wird 1 zurückgeliefertSonst: Als Texturwert wird 0 zurückgeliefert
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
Was passiert mit 0/1 Ergebnis, abhängig von glTexEnv()GL_LUMINANCE, GL_INTENSITY, GL_ALPHA
T.Grosch - 37 -
SelbstverdeckungSelbstverdeckung1 Pixel in
Shadow Map
Da die Oberfläche nur aneinigen Punkten abgetastet
wurde werden Bereichewurde, werden Bereicheder Oberfläche alsverdeckt eingestuft
Grösserer Abstandzur Lichtquelle
Kleinerer Abstandzur Lichtquelle
T.Grosch - 38 -z
Polygon Offset (Depth Bias)Polygon Offset (Depth Bias)
Bei Generierung derShadow Map wird durch
glPolygonOffset der z-Wertpro Pixel nach hinten
verschoben
Di V hi bDie Verschiebungist abhängig von
der Steigungdes Polygonsdes Polygons
T.Grosch - 39 -z
Polygon Offset (Depth Bias)Polygon Offset (Depth Bias)
glEnable(GL POLYGON OFFSET FILL);glEnable(GL_POLYGON_OFFSET_FILL);Korrektur z-Wert vor Eintrag in z-Buffer
glPolygonOffset(offsetFactor, offsetUnits);glPolygonOffset(offsetFactor, offsetUnits);Um wieviel soll korrigiert werden
Di W t i d H d bhä i !Die Werte sind Hardware-abhängig !
T.Grosch - 40 -
Polygon Offset (Depth Bias)Polygon Offset (Depth Bias)
Ohne PolygonOffset Offset zu klein
Offset gerade richtig Offset zu groß
T.Grosch - 41 -
Beispiele für Shadow MapsBeispiele für Shadow Maps
Echtzeit Luxo Jr. auf Apple Macintosh Steve Jobs 2001T St Steve Jobs 2001Toy Story
Studienarbeit Michael Nikelsky
T.Grosch - 42 -
Studienarbeit Michael Nikelsky
Percentage Closer Filtering (PCF)Percentage Closer Filtering (PCF)
Aliasing Effektean den Schattenkanten
reduzieren
Filter fürS h tt d
10 Schattenrand
[Reeves 1987]
T.Grosch - 43 -
Percentage Closer FilteringPercentage Closer FilteringglTexParameteri(GL TEXTURE 2D, GL TEXTURE MAG FILTER,glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL LINEAR);GL_LINEAR);
Direkte Anwendung des Filters auf Tiefenmap macht keinen Sinn, man würde Tiefenwerte interpolierenStattdessen Tiefenvergleich für umliegende 4 Texturpixel mit Ergebnis 0 oder 1Die Ergebnisse werden bilinear interpoliert
T.Grosch - 44 -
Percentage Closer FilteringPercentage Closer Filtering
T.Grosch - 45 -
Besseres PCFBesseres PCFMit Fragment Program möglich: Besserer Filter für Schattenkanteng g g
[Bunnell, GPU Gems 1]
Standard OpenGL 16 Samples4 Samples,Jittering
T.Grosch - 46 -
Noch besseres PCFNoch besseres PCFIdee: PCF mit nur einem SampleIdee: PCF mit nur einem Sample
Vorfilterung der Shadow Map durch MipMappingEnthält Annahmen über die lokale Umgebung des Pixels (z.B. planare Fläche)
Variance Shadow Maps [Donnelly et al 2006]Variance Shadow Maps [Donnelly et al. 2006]
Wahrscheinlichkeit der Verschattung [0,1] aus Varianz der z-Werte innerhalb der Filterregion bestimmenMipMap enthält z und z²
Convolution Shadow Maps [Annen et al 2007]Convolution Shadow Maps [Annen et al. 2007]
z-Vergleich filtern statt z-Werte filternFourier Reihe mit wenigen Koeffizienten
T.Grosch - 47 -
RandproblemeRandprobleme
Shadow Maps sind Schatten von SpotlichtquellenShadow Maps sind Schatten von SpotlichtquellenFür Bereiche außerhalb der Schattentextur wird Textur Clamping angewendet:Clamping angewendet:
Bei GL_CLAMP, GL_CLAMP_TO_EDGE „Schattenstreifen“GL_CLAMP_TO_BORDER sinnvoller, aber evtl. nur software-emuliert
Schatten am Rand
Bereich vonSchattentextur
Schatten am Rand
Ambientes Licht aus, nur Licht von Spot anMultipass
T.Grosch - 48 -
p
Weiche SchattenWeiche Schatten
Bisher immer harte SchattenkantenBisher immer harte SchattenkantenPCF erzeugt keine echten HalbschattenUnrealistisch, da in der Realität immer ausgedehnte gLichtquellenAusnahme z.B. Sonnenlicht
Kernschatten
Halbschatten
T.Grosch - 49 -
Weiche SchattenWeiche SchattenEinfachste Variante: Überlagerung mehrerer harter Schatteng g
Mehrere Punkte auf Lichtquelle auswählen, pro Punkt Shadow Map bestimmenAccumulation Buffer verwenden oder einzelne Schatten über Blending kombinieren
T.Grosch - 50 -
Verschiedene Anzahl Shadow MapsVerschiedene Anzahl Shadow Maps
1 41
8 16
T.Grosch - 51 -
Schnellere Soft ShadowsSchnellere Soft ShadowsIdee:Idee:
Betrachte die Shadow Map als grobe Repräsentation der Szene jedes Texel ist ein kleines Patch
Der Grad der Verschattung kann durch Rückprojektion der Patches in die Flächenlichtquelle berechnet werden
• Verschattung = Wieviel Prozent der Flächenlichtquelle werden durchFlächenlichtquelle werden durch Rückprojektion abgedeckt
Die Anzahl der Patches kann durch eine Hierarchische Shadow Map (HSM) reduziert werden
[Schwarz et al. 2007]
T.Grosch - 52 -
[ ][Guennebaud et al. 2006]
Schnelle Soft ShadowsSchnelle Soft Shadows
[Schwarz et al. 2007], 10-35 fps [Guennebaud et al. 2006], 25 fps
T.Grosch - 53 -
Post-Perspective Shadow MappingPost-Perspective Shadow Mapping
Idee von Stamminger & Drettakis ´02:Idee von Stamminger & Drettakis 02: Kamera in Lichtquelle betrachtet die Szene, aber nach der perspektivischen Division von der Betrachterposition
Pixel der Shadow Mapsind im Bild überall
T.Grosch - 54 -
sind im Bild überall ungefähr gleich groß
Post-Perspective Shadow MappingPost-Perspective Shadow Mapping
Studienarbeit Nico Hempe (Trapezoid Shadow Mapping)
T.Grosch - 55 -
Shadow MapsShadow Maps
VorteileVorteileBeliebig komplexe Geometrie, bei grossen Modellen i.A. schneller als Shadow VolumesLäuft komplett mit Grafik Hardware
N ht ilNachteileAliasing, Schattenkanten eckigZ fighting falsche SelbstverschattungZ-fighting, falsche SelbstverschattungNur Spotlights
T.Grosch - 56 -
Shadow Maps ErweiterungenShadow Maps ErweiterungenAnti-Aliasing (z Buffer & Schattenkanten)
[Reeves et al.1987] (PCF)[Reeves et al.1987] (PCF)[Zhang 1998 ](Forward Shadow Mapping)[Fernando et al. 2000] (Adaptive Shadow Maps)[Brabec et al. 2002 ](Practical Shadow Mapping)[Stamminger / Drettakis 2002] (Perspective Shadow Maps)[Stamminger / Drettakis 2002] (Perspective Shadow Maps)[Sen et al. 2003] (Shadow Silhouette Maps)[Weiskopf et al. 2003] (Dual Depth Layers)[Govindaraju et al. 2003] (Shadow Maps für grosse Szenen)[Wimmer et al. 2004] (Light Space Shadow Maps)[Wimmer et al. 2004] (Light Space Shadow Maps)[Martin et al. 2004] (Trapezoidal Shadow Maps)[Chan & Durand 2004] (Kombination Shadow Maps & Shadow Volumes)[Aila & Laine 2004] (Alias-Free Shadow Maps)[Chong et al. 2004] (A Lixel for every Pixel)[Chong et al. 2004] (A Lixel for every Pixel) [Arvo et al. 2004] (Tiled Shadow Maps)[Lloyd et al. 2006] (Shadow Map Warping and Partitioning)[Donnelly et al. 2006] (Variance Shadow Maps)[Zhang et al. 2007] (Split Shadow Maps)[Zhang et al. 2007] (Split Shadow Maps)[Lauritzen et al. 2007] (Summed Area Variance Shadow Maps)[Annen et al. 2007] (Convolution Shadow Maps)[Annen et al. 2008] (Exponential Shadow Maps)[Sintorn et al. 2008] (Alias-Free Shadow Maps in CUDA)
T.Grosch - 57 -
[ ] ( p )
Shadow Maps ErweiterungenShadow Maps ErweiterungenWeiche Schatten
[Heidrich et al.] (Lineare Lichtquelle)[Heidrich et al.] (Lineare Lichtquelle)[Agrawala et al. 2000] (Image Based Shadow Maps)[Ying et al. 2002] (Area Approximation)[Brabec et al.] (Single Sample)[Chan & Durand 2003] (Smoothies)[Chan & Durand 2003] (Smoothies)[Wyman & Hansen 2003] (Penumbra Maps)[Arvo et al. 2004] (Approximate Soft Shadows)[Guennebaud et al. 2006] (Backprojection)[Schwarz et al. 2007] (Bitmask Soft Shadows)[Schwarz et al. 2007] (Bitmask Soft Shadows)[Annen et al. 2008] (Convolution Soft Shadow Maps)[Yang et al. 2009] (Variance Soft Shadow Maps)
KompressionKompression[Arvo et al. 2004] (Compressed Shadow Maps)[Ritschel et al. 2007] (Coherent Shadow Maps)[Ritschel et al. 2008] (Coherent Surface Shadow Maps)
T.Grosch - 58 -
ZusammenfassungZusammenfassung
Projektive SchattenProjektive SchattenEinfach und schnell ein Schatten auf dem Boden
Shadow VolumesPixelgenaue Schatten, Geometrie geschlossen, Vorverarbeitung
Shadow MapsShadow MapsSchnell bei großen Geometrien, aber verschiedene Artefakte
T.Grosch - 59 -