SlideShare ist ein Scribd-Unternehmen logo
1 von 28
Downloaden Sie, um offline zu lesen
CARL
      VON
OSSIETZKY
            Projection Shadows

            Johannes Diemke

            ¨
            Ubung im Modul OpenGL mit Java
            Wintersemester 2010/2011
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
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
   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
Projection Shadows


Terminologie




   Johannes Diemke   OpenGL mit Java   WiSe 2010 / 2011   8/28
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
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
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
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
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
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
    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
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
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
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
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
Projection Shadows


Umsetzung in OpenGL
    shadowMatrix_[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
   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
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
Projection Shadows


Umsetzung in OpenGL




   Johannes Diemke    OpenGL mit Java   WiSe 2010 / 2011   23/28
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
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
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
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
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

Weitere ähnliche Inhalte

Mehr von Johannes Diemke

2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading
Johannes Diemke
 
2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJ2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJ
Johannes Diemke
 
2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-Mapping2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-Mapping
Johannes Diemke
 
2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-Knoten2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-Knoten
Johannes Diemke
 
2010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt052010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt05
Johannes Diemke
 
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
Johannes Diemke
 
2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung
Johannes Diemke
 
2010-JOGL-01-Organisation
2010-JOGL-01-Organisation2010-JOGL-01-Organisation
2010-JOGL-01-Organisation
Johannes Diemke
 
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Johannes Diemke
 
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
Johannes Diemke
 
Software Produktlinien: Einführung und Überblick (Vortrag)
Software Produktlinien: Einführung und Überblick (Vortrag)Software Produktlinien: Einführung und Überblick (Vortrag)
Software Produktlinien: Einführung und Überblick (Vortrag)
Johannes Diemke
 
Theory Exploration (Vortrag)
Theory Exploration (Vortrag)Theory Exploration (Vortrag)
Theory Exploration (Vortrag)
Johannes Diemke
 
Domainvergabe durch die DENIC (Vortrag)
Domainvergabe durch die DENIC (Vortrag)Domainvergabe durch die DENIC (Vortrag)
Domainvergabe durch die DENIC (Vortrag)
Johannes Diemke
 
Team Oldenburger Robo-Fußball – Abschlussbericht der Projektgruppe 2010
Team Oldenburger Robo-Fußball – Abschlussbericht  der Projektgruppe  2010Team Oldenburger Robo-Fußball – Abschlussbericht  der Projektgruppe  2010
Team Oldenburger Robo-Fußball – Abschlussbericht der Projektgruppe 2010
Johannes Diemke
 
Agile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: ScrumAgile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: Scrum
Johannes Diemke
 
Vorstellung des Roboterfußball-Teams TORF (Vortrag)
Vorstellung des Roboterfußball-Teams TORF (Vortrag)Vorstellung des Roboterfußball-Teams TORF (Vortrag)
Vorstellung des Roboterfußball-Teams TORF (Vortrag)
Johannes Diemke
 

Mehr von Johannes Diemke (20)

Polymorphie
PolymorphiePolymorphie
Polymorphie
 
Pfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen PotentialfeldernPfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen Potentialfeldern
 
2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading
 
2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJ2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJ
 
2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-Mapping2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-Mapping
 
2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-Knoten2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-Knoten
 
2010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt052010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt05
 
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
2010-JOGL-04-Geometrische-Primitive-und-Hidden-Surface-Removal
 
2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung
 
2010-JOGL-01-Organisation
2010-JOGL-01-Organisation2010-JOGL-01-Organisation
2010-JOGL-01-Organisation
 
Boost C++ Libraries
Boost C++ LibrariesBoost C++ Libraries
Boost C++ Libraries
 
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
Einführung in minimale Spannbäume und deren Berechnung (Vortrag)
 
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
Einführung in minimale Spannbäume und deren Berechnung (Ausarbeitung)
 
Software Produktlinien: Einführung und Überblick (Vortrag)
Software Produktlinien: Einführung und Überblick (Vortrag)Software Produktlinien: Einführung und Überblick (Vortrag)
Software Produktlinien: Einführung und Überblick (Vortrag)
 
Theory Exploration (Vortrag)
Theory Exploration (Vortrag)Theory Exploration (Vortrag)
Theory Exploration (Vortrag)
 
Domainvergabe durch die DENIC (Vortrag)
Domainvergabe durch die DENIC (Vortrag)Domainvergabe durch die DENIC (Vortrag)
Domainvergabe durch die DENIC (Vortrag)
 
Team Oldenburger Robo-Fußball – Abschlussbericht der Projektgruppe 2010
Team Oldenburger Robo-Fußball – Abschlussbericht  der Projektgruppe  2010Team Oldenburger Robo-Fußball – Abschlussbericht  der Projektgruppe  2010
Team Oldenburger Robo-Fußball – Abschlussbericht der Projektgruppe 2010
 
Vorstellung des Roboterfußball-Teams TORF (Ausarbeitung)
Vorstellung des Roboterfußball-Teams TORF (Ausarbeitung)Vorstellung des Roboterfußball-Teams TORF (Ausarbeitung)
Vorstellung des Roboterfußball-Teams TORF (Ausarbeitung)
 
Agile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: ScrumAgile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: Scrum
 
Vorstellung des Roboterfußball-Teams TORF (Vortrag)
Vorstellung des Roboterfußball-Teams TORF (Vortrag)Vorstellung des Roboterfußball-Teams TORF (Vortrag)
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
  • 3. Projection Shadows FIFA International Soccer (1994) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/28
  • 4. Projection Shadows Nascar Racing (1995) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/28
  • 5. Projection Shadows Tomb Raider (1996) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/28
  • 6. Projection Shadows Doom 3 (2004) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/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
  • 8. Projection Shadows Terminologie Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/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
  • 14. Projection Shadows Projektion auf eine beliebige Ebene π :n·x+d =0 Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/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
  • 20. Projection Shadows Umsetzung in OpenGL shadowMatrix_[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
  • 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
  • 23. Projection Shadows Umsetzung in OpenGL Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/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 Oberfl¨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