V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon...

59
Schatten Schatten 13. Vorlesung Photorealistische Computergrafik Photorealistische Computergrafik Thorsten Grosch Thorsten Grosch

Transcript of V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon...

Page 1: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

SchattenSchatten

13. VorlesungPhotorealistische ComputergrafikPhotorealistische Computergrafik

Thorsten GroschThorsten Grosch

Page 2: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 3: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Verschiedene SchattentypenVerschiedene Schattentypen

LightmapsLightmapsStatische Schatten in Textur

Schwarze Flecken unter SpielfigurSchwarze Flecken unter Spielfigur

In dieser VorlesungPlanare SchattenPlanare SchattenShadow VolumesShadow Maps

T.Grosch - 3 -

Page 4: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 5: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 6: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 7: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 8: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 9: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 10: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Shadow Volume im 3DShadow Volume im 3D

Einige Kanten der Geometrie sind SilhouettenkantenEinige Kanten der Geometrie sind Silhouettenkanten

(Bild S.Brabec)

T.Grosch - 10 -

Page 11: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 12: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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)

Page 13: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 14: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 15: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 16: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 17: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 18: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 19: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 20: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 21: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 22: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Beispiele Shadow VolumesBeispiele Shadow Volumes

Doom 3nVIDIA

T.Grosch - 22 -

Page 23: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 24: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 25: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 )

Page 26: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 27: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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)

Page 28: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 29: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 30: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 31: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 32: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Shadow MapsShadow Maps

Kamera in Lichtquelle setzen, z-Buffer auslesen

Depth-Texture von Lichtquelleaus projizierenp j

Schatten eines Spotlightsaus Tiefenwerten bestimmen

T.Grosch - 32 -

Page 33: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 34: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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)

Page 35: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 36: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 37: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 38: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 39: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 40: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 41: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Polygon Offset (Depth Bias)Polygon Offset (Depth Bias)

Ohne PolygonOffset Offset zu klein

Offset gerade richtig Offset zu groß

T.Grosch - 41 -

Page 42: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 43: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 44: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 45: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Percentage Closer FilteringPercentage Closer Filtering

T.Grosch - 45 -

Page 46: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 47: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 48: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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

Page 49: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 50: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 51: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Verschiedene Anzahl Shadow MapsVerschiedene Anzahl Shadow Maps

1 41

8 16

T.Grosch - 51 -

Page 52: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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]

Page 53: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Schnelle Soft ShadowsSchnelle Soft Shadows

[Schwarz et al. 2007], 10-35 fps [Guennebaud et al. 2006], 25 fps

T.Grosch - 53 -

Page 54: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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ß

Page 55: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

Post-Perspective Shadow MappingPost-Perspective Shadow Mapping

Studienarbeit Nico Hempe (Trapezoid Shadow Mapping)

T.Grosch - 55 -

Page 56: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 57: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 )

Page 58: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -

Page 59: V 13 Schatten [Kompatibilitätsmodus] · Datenstruktur für Polygyg , j yg pon, jedes Polygon speichert Liste der Nachbarpolygone ...

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 -