Vorstellung des Roboterfußball-Teams TORF (Vortrag)
2010-JOGL-12-Projection-Shadows
1. CARL
VON
OSSIETZKY
Projection Shadows
Johannes Diemke
¨
Ubung im Modul OpenGL mit Java
Wintersemester 2010/2011
2. Projection Shadows
Motivation
Schatten sind ein wichtiger Grundbestandteil beim Erzeugen
realistischer Bilder
Geben dem Betrachter Hinweise uber die Platzierung und
¨
Ausdehnung von Objekten
Die wichtigsten Verfahren f¨r Echtzeit sind:
u
Projection Shadows
Shadow Volumes
Shadow Map
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/28
7. Projection Shadows
Planare Schatten
Einfacher Spezialfall bei dem Schatten auf eine planare Fl¨che
a
geworfen wird
Im Folgenden ausschließlich Betrachtung dieses Spezialfalls
Verwendete Terminologie:
Occluder sind Objekte die Schatten auf Receiver werfen
Punktlichtquellen erzeugen nur Hard Shadows (scharfe Konturen)
Fl¨chenlichtquellen dagegen Soft Shadows
a
Es wird zwischen Kernschatten und Halbschatten unterschieden
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/28
9. Projection Shadows
Projection Shadows
Verfahren zur Darstellung von planaren Schatten
Berechnet Schatten automatisch aus den schattenwerfenden
Occludern
Um den Schatten zu erzeugen wird das dreidimensionale Objekt ein
zweites Mal gerendert
Eine Matrix wird hergeleitet um die Raumkoordinaten eines Objektes
auf eine Ebene zu projizieren
Zun¨chst die Herleitung f¨r planare Schatten auf der Ebene y = 0
a u
Idee: Zwei ¨hnliche Dreiecke haben gleiche Seitenverh¨ltnisse
a a
Projektion f¨r die x- und y-Koordinate finden
u
F¨r y gilt immer y = 0
u
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/28
10. Projection Shadows
Herleitung der Projektion f¨r die x-Koordinate
u
px − lx ly ly vx − lx vy
= ⇐⇒ px =
vx − lx ly − vy ly − vy
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/28
11. Projection Shadows
Herleitung f¨r die Projektion auf die Ebene y = 0
u
Analog zu px ergibt sich pz , so dass wir insgesamt die folgenden
Gleichungen erhalten:
ly vx − lx vy
px =
ly − vy
py = 0
ly vz − lz vy
pz =
ly − vy
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/28
12. Projection Shadows
Herleitung f¨r die Projektion auf die Ebene y = 0
u
Die Gleichungen k¨nnen jetzt in eine Projektions-Matrix M
o
uberf¨hrt werden:
¨ u
ly −lx 0 0
0 0 0 0
M=
0 −lz ly 0
0 −1 0 ly
Es l¨sst sich einfach zeigen, dass Mv = p tats¨chlich gilt
a a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/28
13. Projection Shadows
Verallgemeinerung f¨r beliebige Ebenen
u
Im Allgemeinen soll Schatten auf eine beliebige Ebene
π : n · x + d = 0 geworfen werden
Ebene liegt hier in Normalform vor
n ist ein beliebiger Normalenvektor der Ebene
d ist ein Skalar, das den negativen Abstand entlang des
Normalenvektors ausgehende vom Ursprung n zur Ebene angibt
Ist ein beliebiger Punkt p der Ebene sowie ein beliebiger
Normalenvektor n der Ebene gegeben, so ergibt sich d durch:
d = −n · p
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/28
15. Projection Shadows
Herleitung der Projektion auf eine Ebene π : n · x + d = 0
Die Gerade r ausgehend von der Lichtquelle l durch den Punkt v ist
gegeben durch:
r : l + γ(v − l)
Weiterhin ist die Ebene π auf die der Schatten projiziert werden soll
gegeben durch:
π :n·x+d =0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/28
16. Projection Shadows
Herleitung der Projektion auf eine Ebene π : n · x + d = 0
Durch Einsetzen der Geradengleichung r in die Ebenengleichung
l¨sst sich ein γ finden f¨r das die Gerade die Ebene schneidet:
a u
n · (l + γ(v − l)) + d = 0
˙
n · l + γn(v − l) + d = 0
γn · (v − l) = −d − n · l
−d − n · l
γ =
n · (v − l)
Durch Einsetzen von γ in die Geradengleichung r ergibt sich der
Schnittpunkt p:
−d − n · l
p = l+ (v − l)
n · (v − l)
d +n·l
= l− (v − l)
n · (v − l)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/28
17. Projection Shadows
Projektion auf eine Ebene π : n · x + d = 0
Der Strahl ausgehend von l durch den Punkt v schneidet die Ebene π
Dies f¨hrt zu dem projizierten Punkt p:
u
d +n·l
p=l− (v − l)
n · (v − l)
Die Gleichung kann jetzt wieder in eine Projektions-Matrix M
uberf¨hrt werden:
¨ u
n · l + d − lx nx −lx ny −lx nz −lx d
−ly nx n · l + d − ly ny −ly nz −ly d
M=
−lz nx −lz ny n · l + d − lz nz −lz d
−nx −ny −nz n·l
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/28
18. Projection Shadows
Umsetzung des Verfahrens
Um Schatten darzustellen, muss die Matrix M auf die Objekte, die
Schatten werfen sollen, angewendet werden
Die projizierten Objekte sollten mit einer dunklen Farbe gerendert
werden
Z-Fighting Probleme, die durch die Projektion auf die Ebene
enstehen, m¨ssen ber¨cksichtigt werden:
u u
Versatz der Projektions-Ebene zur Fl¨che, so dass der Schatten
a
immer vor der Fl¨che gerendert wird
a
Alternativ: projizierte Objekte mit ausgeschaltetem Z-Buffer zeichnen
Der Stencil-Buffer wird ben¨tigt um den Schattenwurf auf die
o
Fl¨che zu beschr¨nken
a a
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/28
19. Projection Shadows
Umsetzung in OpenGL
Im Folgenden wird zun¨chst d und n · l berechnet um dann M t zu
a
konstruieren:
public PhotekProjectionShadows(PhotekVector3D lightPosition, PhotekPlane plane) {
shadowMatrix_ = new float[16];
lightPosition_ = lightPosition;
plane_ = plane;
}
public void constructShadowMatrix() {
float NdotL, d;
d = -plane_.point_.dot(plane_.normal_);
NdotL = plane_.normal_.x * lightPosition_.x +
plane_.normal_.y * lightPosition_.y +
plane_.normal_.z * lightPosition_.z;
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/28
21. Projection Shadows
Umsetzung in OpenGL
Mit der Methode applyShadowMatrix(GL gl) wird die Projektions-Matrix
angewendet:
public void applyShadowMatrix(GL gl) {
gl.glMultTransposeMatrixf(shadowMatrix_, 0);
}
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/28
22. Projection Shadows
Umsetzung in OpenGL
Zun¨chst das Objekt und daraufhin den Schatten rendern:
a
model.draw(gl);
shadows.applyShadowMatrix(gl);
// Den Schatten nicht mehrfach transparent uebereinander rendern
gl.glEnable(GL.GL_STENCIL_TEST);
gl.glStencilFunc(GL.GL_EQUAL, 0, 0xFFFFFFFF);
gl.glStencilOp(GL.GL_KEEP,GL.GL_KEEP,GL.GL_INCR);
gl.glDisable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_BLEND);
gl.glColor4f(0,0,0,0.7f);
model.draw(gl);
gl.glDisable(GL.GL_STENCIL_TEST);
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/28
24. Projection Shadows
Auftretende Probleme
Die beiden genannten Projektions-Matrizen f¨hren nicht in jedem
u
Fall zum gew¨nschten Verhalten
u
Ist die Lichtquelle unter der obersten Raumkoordinate eines Objektes,
werden Anti-Shadows generiert
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 24/28
25. Projection Shadows
Nachteile
Schatten nur auf planaren Fl¨chen m¨glich
a o
Soft Shadows sollten Hard Shadows vorgezogen werden
Schatten mit scharfen Konturen k¨nnen teilweise als geometrische
o
Beschaffenheit fehlintepretiert werden (bspw. als Falten in
Ober߬chen)
a
Hard Shadows sehen in vielen Szenarien unnat¨rlich aus
u
Existieren ideale Punktlichtquellen in der Realit¨t?
a
Aufwand des Verfahrens h¨ngt von der Komplexit¨t der Szene ab
a a
Objekte, die Schatten werfen sollen, m¨ssen ein zweites Mal
u
gerendert werden
Anti-Shadows und False-Shadows m¨glich
o
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/28
26. Projection Shadows
Vorteile
Verfahren ist sehr einfach zu implementieren
Wichtiger als sch¨ner und naturgetreuer Schatten ist es uberhaupt
o ¨
Schatten zu haben (Bsp. Blob Shadows)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/28
27. Literatur und Links
Mason Woo, Jackie Neider, Tom Davis and Dave Shreiner
OpenGL Programming Guide
http://www.opengl.org/documentation/red book/
Randi J. Rost
OpenGL Shading Language
http://www.3dshaders.com/
Richard S. Wright and Michael Sweet
OpenGL SuperBible
http://www.starstonesoftware.com/OpenGL/
Tomas M¨ller and Eric Haines
o
Real-Time Rendering
http://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 27/28
28. Literatur und Links
Fletcher Dunn and Ian Parberry
3D Math Primer For Graphics and Game Development
http://www.gamemath.com/
Khronos Group
OpenGL Homepage
http://www.opengl.org/
Game Technology Group at Sun Microsystems
JOGL API Project
https://jogl.dev.java.net/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 28/28