Date post: | 26-Jun-2015 |
Category: |
Documents |
Upload: | johannes-diemke |
View: | 285 times |
Download: | 0 times |
C A R LV O N
O S S I E T Z K Y
Projection Shadows
Johannes Diemke
Ubung im Modul OpenGL mit JavaWintersemester 2010/2011
Projection Shadows
Motivation
I Schatten sind ein wichtiger Grundbestandteil beim Erzeugenrealistischer Bilder
I Geben dem Betrachter Hinweise uber die Platzierung undAusdehnung von Objekten
I Die wichtigsten Verfahren fur Echtzeit sind:
Projection ShadowsShadow VolumesShadow Map
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/28
Projection Shadows
FIFA International Soccer (1994)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/28
Projection Shadows
Nascar Racing (1995)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/28
Projection Shadows
Tomb Raider (1996)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/28
Projection Shadows
Doom 3 (2004)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/28
Projection Shadows
Planare Schatten
I Einfacher Spezialfall bei dem Schatten auf eine planare Flachegeworfen wird
I Im Folgenden ausschließlich Betrachtung dieses Spezialfalls
I Verwendete Terminologie:
Occluder sind Objekte die Schatten auf Receiver werfenPunktlichtquellen erzeugen nur Hard Shadows (scharfe Konturen)Flachenlichtquellen dagegen Soft ShadowsEs wird zwischen Kernschatten und Halbschatten unterschieden
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/28
Projection Shadows
Terminologie
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/28
Projection Shadows
Projection Shadows
I Verfahren zur Darstellung von planaren Schatten
I Berechnet Schatten automatisch aus den schattenwerfendenOccludern
Um den Schatten zu erzeugen wird das dreidimensionale Objekt einzweites Mal gerendertEine Matrix wird hergeleitet um die Raumkoordinaten eines Objektesauf eine Ebene zu projizieren
I Zunachst die Herleitung fur planare Schatten auf der Ebene y = 0
Idee: Zwei ahnliche Dreiecke haben gleiche SeitenverhaltnisseProjektion fur die x- und y-Koordinate findenFur y gilt immer y = 0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/28
Projection Shadows
Herleitung der Projektion fur die x-Koordinate
px − lxvx − lx
=ly
ly − vy⇐⇒ px =
lyvx − lxvy
ly − vy
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/28
Projection Shadows
Herleitung fur die Projektion auf die Ebene y = 0
I Analog zu px ergibt sich pz , so dass wir insgesamt die folgendenGleichungen erhalten:
px =lyvx − lxvy
ly − vy
py = 0
pz =lyvz − lzvy
ly − vy
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/28
Projection Shadows
Herleitung fur die Projektion auf die Ebene y = 0
I Die Gleichungen konnen jetzt in eine Projektions-Matrix Muberfuhrt werden:
M =
ly −lx 0 00 0 0 00 −lz ly 00 −1 0 ly
I Es lasst sich einfach zeigen, dass Mv = p tatsachlich gilt
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/28
Projection Shadows
Verallgemeinerung fur beliebige Ebenen
I Im Allgemeinen soll Schatten auf eine beliebige Ebeneπ : n · x + d = 0 geworfen werden
I Ebene liegt hier in Normalform vor
n ist ein beliebiger Normalenvektor der Ebened ist ein Skalar, das den negativen Abstand entlang desNormalenvektors ausgehende vom Ursprung n zur Ebene angibtIst ein beliebiger Punkt p der Ebene sowie ein beliebigerNormalenvektor n der Ebene gegeben, so ergibt sich d durch:
d = −n · p
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/28
Projection Shadows
Projektion auf eine beliebige Ebene
π : n · x + d = 0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/28
Projection Shadows
Herleitung der Projektion auf eine Ebene π : n · x + d = 0
I Die Gerade r ausgehend von der Lichtquelle l durch den Punkt v istgegeben durch:
r : l + γ(v− l)
I Weiterhin ist die Ebene π auf die der Schatten projiziert werden sollgegeben durch:
π : n · x + d = 0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/28
Projection Shadows
Herleitung der Projektion auf eine Ebene π : n · x + d = 0
I Durch Einsetzen der Geradengleichung r in die Ebenengleichunglasst sich ein γ finden fur das die Gerade die Ebene schneidet:
n · (l + γ(v− l)) + d = 0
n · l + γn(v− l) + d = 0
γn · (v− l) = −d − n · l
γ =−d − n · ln · (v− l)
I Durch Einsetzen von γ in die Geradengleichung r ergibt sich derSchnittpunkt p:
p = l +−d − n · ln · (v− l)
(v− l)
= l− d + n · ln · (v− l)
(v− l)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/28
Projection Shadows
Projektion auf eine Ebene π : n · x + d = 0
I Der Strahl ausgehend von l durch den Punkt v schneidet die Ebene π
I Dies fuhrt zu dem projizierten Punkt p:
p = l− d + n · ln · (v− l)
(v− l)
I Die Gleichung kann jetzt wieder in eine Projektions-Matrix Muberfuhrt werden:
M =
n · l + d − lxnx −lxny −lxnz −lxd−lynx n · l + d − lyny −lynz −lyd−lznx −lzny n · l + d − lznz −lzd−nx −ny −nz n · l
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/28
Projection Shadows
Umsetzung des Verfahrens
I Um Schatten darzustellen, muss die Matrix M auf die Objekte, dieSchatten werfen sollen, angewendet werden
I Die projizierten Objekte sollten mit einer dunklen Farbe gerendertwerden
I Z-Fighting Probleme, die durch die Projektion auf die Ebeneenstehen, mussen berucksichtigt werden:
Versatz der Projektions-Ebene zur Flache, so dass der Schattenimmer vor der Flache gerendert wirdAlternativ: projizierte Objekte mit ausgeschaltetem Z-Buffer zeichnen
I Der Stencil-Buffer wird benotigt um den Schattenwurf auf dieFlache zu beschranken
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/28
Projection Shadows
Umsetzung in OpenGL
I Im Folgenden wird zunachst d und n · l berechnet um dann Mt zukonstruieren:
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
Projection Shadows
Umsetzung in OpenGLshadowMatrix_[0 ] = NdotL + d - lightPosition_.x * plane_.normal_.x;
shadowMatrix_[1 ] = - lightPosition_.x * plane_.normal_.y;
shadowMatrix_[2 ] = - lightPosition_.x * plane_.normal_.z;
shadowMatrix_[3 ] = - lightPosition_.x * d ;
shadowMatrix_[4 ] = - lightPosition_.y * plane_.normal_.x;
shadowMatrix_[5 ] = NdotL + d - lightPosition_.y * plane_.normal_.y;
shadowMatrix_[6 ] = - lightPosition_.y * plane_.normal_.z;
shadowMatrix_[7 ] = - lightPosition_.y * d ;
shadowMatrix_[8 ] = - lightPosition_.z * plane_.normal_.x;
shadowMatrix_[9 ] = - lightPosition_.z * plane_.normal_.y;
shadowMatrix_[10] = NdotL + d - lightPosition_.z * plane_.normal_.z;
shadowMatrix_[11] = - lightPosition_.z * d ;
shadowMatrix_[12] = - plane_.normal_.x;
shadowMatrix_[13] = - plane_.normal_.y;
shadowMatrix_[14] = - plane_.normal_.z;
shadowMatrix_[15] = NdotL;
}
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/28
Projection Shadows
Umsetzung in OpenGL
I Mit der Methode applyShadowMatrix(GL gl) wird die Projektions-Matrixangewendet:
public void applyShadowMatrix(GL gl) {
gl.glMultTransposeMatrixf(shadowMatrix_, 0);
}
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/28
Projection Shadows
Umsetzung in OpenGL
I Zunachst das Objekt und daraufhin den Schatten rendern:
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
Projection Shadows
Umsetzung in OpenGL
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/28
Projection Shadows
Auftretende ProblemeI Die beiden genannten Projektions-Matrizen fuhren nicht in jedem
Fall zum gewunschten VerhaltenIst die Lichtquelle unter der obersten Raumkoordinate eines Objektes,werden Anti-Shadows generiert
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 24/28
Projection Shadows
Nachteile
I Schatten nur auf planaren Flachen moglich
I Soft Shadows sollten Hard Shadows vorgezogen werden
Schatten mit scharfen Konturen konnen teilweise als geometrischeBeschaffenheit fehlintepretiert werden (bspw. als Falten inOberflachen)Hard Shadows sehen in vielen Szenarien unnaturlich ausExistieren ideale Punktlichtquellen in der Realitat?
I Aufwand des Verfahrens hangt von der Komplexitat der Szene ab
Objekte, die Schatten werfen sollen, mussen ein zweites Malgerendert werden
I Anti-Shadows und False-Shadows moglich
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/28
Projection Shadows
Vorteile
I Verfahren ist sehr einfach zu implementieren
I Wichtiger als schoner und naturgetreuer Schatten ist es uberhauptSchatten zu haben (Bsp. Blob Shadows)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/28
Literatur und Links
� Mason Woo, Jackie Neider, Tom Davis and Dave ShreinerOpenGL Programming Guidehttp://www.opengl.org/documentation/red book/
� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/
� Richard S. Wright and Michael SweetOpenGL SuperBiblehttp://www.starstonesoftware.com/OpenGL/
� Tomas Moller and Eric HainesReal-Time Renderinghttp://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 27/28
Literatur und Links
� Fletcher Dunn and Ian Parberry3D Math Primer For Graphics and Game Developmenthttp://www.gamemath.com/
� Khronos GroupOpenGL Homepagehttp://www.opengl.org/
� Game Technology Group at Sun MicrosystemsJOGL API Projecthttps://jogl.dev.java.net/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 28/28