SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
CARL
      VON
OSSIETZKY
            Geometrische Primitive und
            Hidden Surface Removal

            Johannes Diemke

            ¨
            Ubung im Modul OpenGL mit Java
            Wintersemester 2010/2011
Wiederholung


Geometrische Primitive in OpenGL
     Mit nur wenigen einfachen Bausteinen k¨nnen hochkomplexe
                                           o
     Strukturen erstellt werden
           Diese Bausteine werden in OpenGL Primitive genannt
           Es existieren genau 10 verschiedene Primitive



gl.glColor3f(0.65f, 0.85f, 0.65f);

gl.glBegin(GL.GL_TRIANGLES);
    gl.glVertex3f(-2.0f, -1.0f, 0.0f);
    gl.glVertex3f( 2.0f, -1.0f, 0.0f);
    gl.glVertex3f( 0.0f, 1.0f, 0.0f);
gl.glEnd();




     Johannes Diemke             OpenGL mit Java          WiSe 2010 / 2011   2/23
Geometrische Primitive


Darstellung von Punkten
     Der Parameter GL.GL_POINTS l¨sst OpenGL die Liste der Vertices als
                                 a
     Punkte interpretieren
           Die Punktgr¨ße kann mit der Methode glPointSize(float size)
                       o
           gesetzt werden
           Vorsicht! Nicht alle Punktgr¨ßen werden unterst¨tzt
                                       o                  u
float range[] = new float[2];
gl.glGetFloatv(GL.GL_POINT_SIZE_RANGE, range, 0);

float step[] = new float[1];
gl.glGetFloatv(GL.GL_POINT_SIZE_GRANULARITY,
               step, 0);

gl.glPointSize(range[0]);

gl.glBegin(GL.GL_POINTS);
    gl.glVertex3f(-2.0f, -1.0f, 0.0f);
    gl.glVertex3f( 2.0f, 1.0f, 0.0f);
gl.glEnd();
     Johannes Diemke             OpenGL mit Java          WiSe 2010 / 2011   3/23
Geometrische Primitive


Darstellung von Liniensegmenten
     Der Parameter GL.GL_LINES l¨sst OpenGL jeweils zwei Vertices der
                                a
     Liste als Liniensegment interpretieren
           Die Linienbreite kann mit der Methode glLineWidth(float width)
           gesetzt werden
           Vorsicht! Nicht alle Linienbreiten werden unterst¨tzt
                                                            u
float range[] = new float[2];
gl.glGetFloatv(GL.GL_LINE_WIDTH_RANGE, range, 0);

float step[] = new float[1];
gl.glGetFloatv(GL.GL_LINE_WIDTH_GRANULARITY,
               step, 0);

gl.glLineWidth(range[1]);

gl.glBegin(GL.GL_LINES);
    gl.glVertex3f(-2.0f, -1.0f, 0.0f);
    gl.glVertex3f( 2.0f, 1.0f, 0.0f);
gl.glEnd();
     Johannes Diemke              OpenGL mit Java           WiSe 2010 / 2011   4/23
Geometrische Primitive


Darstellung von Linienz¨gen
                       u

   Der Parameter
   GL.GL_LINE_STRIP l¨sst OpenGL die Liste
                     a
   der Vertices als Linienzug interpretieren
   gl.glBegin(GL.GL_LINE_STRIP);
       gl.glVertex3f( 0.0f,   0.0f, 0.0f);
       gl.glVertex3f(50.0f, 50.0f, 0.0f);
       gl.glVertex3f(50.0f, 100.0f, 0.0f);
   gl.glEnd();




    Johannes Diemke            OpenGL mit Java   WiSe 2010 / 2011   5/23
Geometrische Primitive


Darstellung von geschlossenen Linienz¨gen
                                     u

   Der Parameter GL.GL_LINE_LOOP
   l¨sst OpenGL die Liste der Vertices
    a
   als geschlossenen Linienzug interpretieren
   gl.glBegin(GL.GL_LINE_LOOP);
       gl.glVertex3f( 0.0f,   0.0f, 0.0f);
       gl.glVertex3f(50.0f, 50.0f, 0.0f);
       gl.glVertex3f(50.0f, 100.0f, 0.0f);
   gl.glEnd();




    Johannes Diemke            OpenGL mit Java   WiSe 2010 / 2011   6/23
Geometrische Primitive


Darstellung von Dreiecken

   Der Parameter GL.GL_TRIANGLES
   l¨sst OpenGL die Liste der
    a
   Vertices als Dreiecke interpretieren
   gl.glBegin(GL.GL_TRIANGLES);
       gl.glVertex3f( 0.0f,   0.0f, 0.0f);
       gl.glVertex3f(25.0f, 25.0f, 0.0f);
       gl.glVertex3f(50.0f,   0.0f, 0.0f);

       gl.glVertex3f(-50.0f,    0.0f, 0.0f);
       gl.glVertex3f(-75.0f,   50.0f, 0.0f);
       gl.glVertex3f(-25.0f,    0.0f, 0.0f);
   gl.glEnd();




    Johannes Diemke             OpenGL mit Java   WiSe 2010 / 2011   7/23
Geometrische Primitive


Einschub: Polygon Winding
   Die Kombination aus Ordnung und Richtung in der die Vertices
   angegeben werden wird als Winding bezeichnet
   In der Standardeinstellung nimmt OpenGL Polygone mit einem
   CCW-Winding als front facing an




   Johannes Diemke          OpenGL mit Java        WiSe 2010 / 2011   8/23
Geometrische Primitive


Darstellung von Triangle Strips
   Der Parameter GL.GL_TRIANGLE_STRIP l¨sst OpenGL die Liste der
                                       a
   Vertices folgendermaßen als Gruppe verbundener Dreiecke
   interpretieren:




    Johannes Diemke          OpenGL mit Java          WiSe 2010 / 2011   9/23
Geometrische Primitive


Darstellung von Triangle Fans
   Der Parameter GL.GL_TRIANGLE_FAN l¨sst OpenGL die Liste der Vertices
                                     a
   folgendermaßen als Gruppe verbundener Dreiecke interpretieren:




    Johannes Diemke          OpenGL mit Java         WiSe 2010 / 2011   10/23
Geometrische Primitive


Color Shading Model
   Farben werden pro Vertex festgelegt
   Das Shading Model bestimmt, ob ein Polygon eine feste Farbe oder
   einen weichen Farbverlauf zwischen den f¨r jeden Vertex
                                           u
   festgelegten Farben besitzt
   Es wird mit der Methode    glShadeModel(int mode)   gesetzt

   // enable flat shading
   gl.glShadeModel(GL.GL_FLAT);

   ...

   // enable smooth shading
   gl.glShadeModel(GL.GL_SMOOTH);




   Johannes Diemke                OpenGL mit Java         WiSe 2010 / 2011   11/23
Hidden Surface Removal


Depth Buffer
   In der Standardeinstellung von OpenGL erscheint das zuletzt
   gezeichnete Objekt uber einem zuvor gezeichneten Objekt
                       ¨
   Dies gilt selbst, wenn das zuletzt gezeichnete Objekt r¨umlich hinter
                                                          a
   anderen liegt
   Dies kann mit dem Depth Testing korrigiert werden → Depth Buffer

   // enable depth testing
   gl.glEnable(GL.GL_DEPTH_TEST);

   ...

   // disable depth testing
   gl.glDisable(GL.GL_DEPTH_TEST);




   Johannes Diemke             OpenGL mit Java        WiSe 2010 / 2011   12/23
Hidden Surface Removal


Depth Buffer (Forts.)




   Johannes Diemke     OpenGL mit Java   WiSe 2010 / 2011   13/23
Hidden Surface Removal


Depth Buffer (Forts.)




   Johannes Diemke     OpenGL mit Java   WiSe 2010 / 2011   14/23
Hidden Surface Removal


Depth Buffer (Forts.)
   Der Depth Buffer muss vor jedem Rendern der Szene geleert werden

   public void display(GLAutoDrawable drawable) {
       GL2 gl = drawable.getGL().getGL2();

        // clear the color and depth buffer
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, -5.0f);

        ...

   }




   Johannes Diemke              OpenGL mit Java            WiSe 2010 / 2011   15/23
Hidden Surface Determination


Back-Face Culling
   Das Back-face Culling vermeidet das Zeichnen der R¨ckseiten von
                                                     u
   Polygonen
   Das ist sinnvoll bei geschlossenen K¨rpern, die nur von außen
                                       o
   betrachtet werden k¨nnen
                        o
   Ein Spezialfall tritt bei transparenten Objekten ein → blending
   // enable back-face culling
   gl.glEnable(GL.GL_CULL_FACE);

   ...

   // disable back-face culling
   gl.glDisable(GL.GL_CULL_FACE);




   Johannes Diemke             OpenGL mit Java        WiSe 2010 / 2011   16/23
Hidden Surface Determination


Back-Face Culling (Forts.)
   Zum Bestimmen der Vorder- und R¨ckseite eines Polygons wird
                                  u
   dessen Winding betrachtet
          Daher ist es wichtig das Polygon-Winding konsistent zu halten

   if(bCull) {
       // enable back-face culling
       gl.glEnable(GL.GL_CULL_FACE);
   } else {
       // disable back-face culling
       gl.glDisable(GL.GL_CULL_FACE);
   }

   Die Festlegung der Vorder- und R¨ckseiten geschieht mit der
                                   u
   Methode glFrontFace(int mode)
   // clockwise-wound polygons are front facing
   gl.glFrontFace(GL.GL_CW);


    Johannes Diemke              OpenGL mit Java           WiSe 2010 / 2011   17/23
Geometrische Primitive


Polygon Modes
   Polygone m¨ssen nicht grunds¨tzlich mit einer Farbe gef¨llt sein
              u                  a                            u
   Mit der Methode glPolygonMode(int face, int mode) l¨sst sich festlegen,
                                                      a
   wie Polygone dargestellt werden sollen:
         GL.GL_POINT
         GL.GL_LINE
         GL.GL_FILL


   if(bOutline) {
       // draw polygons as outlines
       gl.glPolygonMode(GL.GL_BACK, GL_LINE)
   } else {
       // draw polygons solid
       gl.glPolygonMode(GL.GL_BACK, GL_FILL)
   }



   Johannes Diemke             OpenGL mit Java         WiSe 2010 / 2011   18/23
Geometrische Primitive


Konstruktionsregeln f¨r Polygone
                     u
   Alle Polygone m¨ssen planar sein
                  u
          Die Vertices eines Polygons m¨ssen immer in genau einer Ebene liegen
                                       u
          Bei Dreiecken ist das uberhaupt kein Problem
                                ¨




    Johannes Diemke              OpenGL mit Java           WiSe 2010 / 2011   19/23
Geometrische Primitive


Konstruktionsregeln f¨r Polygone (Forts.)
                     u
   Es darf keine Schnittpunkte zwischen den Kanten eines Polygons
   geben
   Polygone m¨ssen konvex sein:
               u
          Jede Strecke zweier Punkte des Polygons liegt vollst¨ndig in ihm
                                                              a




    Johannes Diemke              OpenGL mit Java            WiSe 2010 / 2011   20/23
Grafikprogrammierung


Ein etwas anderes Beispiel ...




    Johannes Diemke        OpenGL mit Java   WiSe 2010 / 2011   21/23
Literatur und Links


 Mason Woo, Jackie Neider, Tom Davis und 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 und Michael Sweet
 OpenGL SuperBibel
 http://www.starstonesoftware.com/OpenGL/
 Tomas M¨ller und Eric Haines
        o
 Real-Time Rendering
 http://www.realtimerendering.com/

   Johannes Diemke           OpenGL mit Java     WiSe 2010 / 2011   22/23
Literatur und Links


 Fletcher Dunn und 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/
 Fairlight und The Black Lotus
 Only one wish
 http://capped.tv/playeralt.php?vid=1215051083-1-0

   Johannes Diemke            OpenGL mit Java        WiSe 2010 / 2011   23/23

Weitere ähnliche Inhalte

Mehr von Johannes Diemke

Pfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen PotentialfeldernPfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen PotentialfeldernJohannes Diemke
 
2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-ShadingJohannes Diemke
 
2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJ2010-JOGL-10-Wavefront-OBJ
2010-JOGL-10-Wavefront-OBJJohannes Diemke
 
2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-Mapping2010-JOGL-09-Texture-Mapping
2010-JOGL-09-Texture-MappingJohannes Diemke
 
2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-Knoten2010-JOGL-08-Torus-Knoten
2010-JOGL-08-Torus-KnotenJohannes Diemke
 
2010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt052010-JOGL-07-Hinweise-Uebungsblatt05
2010-JOGL-07-Hinweise-Uebungsblatt05Johannes Diemke
 
2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung2010-JOGL-02-Einfuehrung
2010-JOGL-02-EinfuehrungJohannes 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 (Ausarbeitung)
Theory Exploration (Ausarbeitung)Theory Exploration (Ausarbeitung)
Theory Exploration (Ausarbeitung)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 2010Johannes Diemke
 
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)Johannes Diemke
 
Agile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: ScrumAgile Vorgehensmodelle in der Softwareentwicklung: Scrum
Agile Vorgehensmodelle in der Softwareentwicklung: ScrumJohannes 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 (18)

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-02-Einfuehrung
2010-JOGL-02-Einfuehrung2010-JOGL-02-Einfuehrung
2010-JOGL-02-Einfuehrung
 
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 (Ausarbeitung)
Theory Exploration (Ausarbeitung)Theory Exploration (Ausarbeitung)
Theory Exploration (Ausarbeitung)
 
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-04-Geometrische-Primitive-und-Hidden-Surface-Removal

  • 1. CARL VON OSSIETZKY Geometrische Primitive und Hidden Surface Removal Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
  • 2. Wiederholung Geometrische Primitive in OpenGL Mit nur wenigen einfachen Bausteinen k¨nnen hochkomplexe o Strukturen erstellt werden Diese Bausteine werden in OpenGL Primitive genannt Es existieren genau 10 verschiedene Primitive gl.glColor3f(0.65f, 0.85f, 0.65f); gl.glBegin(GL.GL_TRIANGLES); gl.glVertex3f(-2.0f, -1.0f, 0.0f); gl.glVertex3f( 2.0f, -1.0f, 0.0f); gl.glVertex3f( 0.0f, 1.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/23
  • 3. Geometrische Primitive Darstellung von Punkten Der Parameter GL.GL_POINTS l¨sst OpenGL die Liste der Vertices als a Punkte interpretieren Die Punktgr¨ße kann mit der Methode glPointSize(float size) o gesetzt werden Vorsicht! Nicht alle Punktgr¨ßen werden unterst¨tzt o u float range[] = new float[2]; gl.glGetFloatv(GL.GL_POINT_SIZE_RANGE, range, 0); float step[] = new float[1]; gl.glGetFloatv(GL.GL_POINT_SIZE_GRANULARITY, step, 0); gl.glPointSize(range[0]); gl.glBegin(GL.GL_POINTS); gl.glVertex3f(-2.0f, -1.0f, 0.0f); gl.glVertex3f( 2.0f, 1.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/23
  • 4. Geometrische Primitive Darstellung von Liniensegmenten Der Parameter GL.GL_LINES l¨sst OpenGL jeweils zwei Vertices der a Liste als Liniensegment interpretieren Die Linienbreite kann mit der Methode glLineWidth(float width) gesetzt werden Vorsicht! Nicht alle Linienbreiten werden unterst¨tzt u float range[] = new float[2]; gl.glGetFloatv(GL.GL_LINE_WIDTH_RANGE, range, 0); float step[] = new float[1]; gl.glGetFloatv(GL.GL_LINE_WIDTH_GRANULARITY, step, 0); gl.glLineWidth(range[1]); gl.glBegin(GL.GL_LINES); gl.glVertex3f(-2.0f, -1.0f, 0.0f); gl.glVertex3f( 2.0f, 1.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/23
  • 5. Geometrische Primitive Darstellung von Linienz¨gen u Der Parameter GL.GL_LINE_STRIP l¨sst OpenGL die Liste a der Vertices als Linienzug interpretieren gl.glBegin(GL.GL_LINE_STRIP); gl.glVertex3f( 0.0f, 0.0f, 0.0f); gl.glVertex3f(50.0f, 50.0f, 0.0f); gl.glVertex3f(50.0f, 100.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/23
  • 6. Geometrische Primitive Darstellung von geschlossenen Linienz¨gen u Der Parameter GL.GL_LINE_LOOP l¨sst OpenGL die Liste der Vertices a als geschlossenen Linienzug interpretieren gl.glBegin(GL.GL_LINE_LOOP); gl.glVertex3f( 0.0f, 0.0f, 0.0f); gl.glVertex3f(50.0f, 50.0f, 0.0f); gl.glVertex3f(50.0f, 100.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/23
  • 7. Geometrische Primitive Darstellung von Dreiecken Der Parameter GL.GL_TRIANGLES l¨sst OpenGL die Liste der a Vertices als Dreiecke interpretieren gl.glBegin(GL.GL_TRIANGLES); gl.glVertex3f( 0.0f, 0.0f, 0.0f); gl.glVertex3f(25.0f, 25.0f, 0.0f); gl.glVertex3f(50.0f, 0.0f, 0.0f); gl.glVertex3f(-50.0f, 0.0f, 0.0f); gl.glVertex3f(-75.0f, 50.0f, 0.0f); gl.glVertex3f(-25.0f, 0.0f, 0.0f); gl.glEnd(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/23
  • 8. Geometrische Primitive Einschub: Polygon Winding Die Kombination aus Ordnung und Richtung in der die Vertices angegeben werden wird als Winding bezeichnet In der Standardeinstellung nimmt OpenGL Polygone mit einem CCW-Winding als front facing an Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/23
  • 9. Geometrische Primitive Darstellung von Triangle Strips Der Parameter GL.GL_TRIANGLE_STRIP l¨sst OpenGL die Liste der a Vertices folgendermaßen als Gruppe verbundener Dreiecke interpretieren: Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/23
  • 10. Geometrische Primitive Darstellung von Triangle Fans Der Parameter GL.GL_TRIANGLE_FAN l¨sst OpenGL die Liste der Vertices a folgendermaßen als Gruppe verbundener Dreiecke interpretieren: Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/23
  • 11. Geometrische Primitive Color Shading Model Farben werden pro Vertex festgelegt Das Shading Model bestimmt, ob ein Polygon eine feste Farbe oder einen weichen Farbverlauf zwischen den f¨r jeden Vertex u festgelegten Farben besitzt Es wird mit der Methode glShadeModel(int mode) gesetzt // enable flat shading gl.glShadeModel(GL.GL_FLAT); ... // enable smooth shading gl.glShadeModel(GL.GL_SMOOTH); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/23
  • 12. Hidden Surface Removal Depth Buffer In der Standardeinstellung von OpenGL erscheint das zuletzt gezeichnete Objekt uber einem zuvor gezeichneten Objekt ¨ Dies gilt selbst, wenn das zuletzt gezeichnete Objekt r¨umlich hinter a anderen liegt Dies kann mit dem Depth Testing korrigiert werden → Depth Buffer // enable depth testing gl.glEnable(GL.GL_DEPTH_TEST); ... // disable depth testing gl.glDisable(GL.GL_DEPTH_TEST); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/23
  • 13. Hidden Surface Removal Depth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/23
  • 14. Hidden Surface Removal Depth Buffer (Forts.) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/23
  • 15. Hidden Surface Removal Depth Buffer (Forts.) Der Depth Buffer muss vor jedem Rendern der Szene geleert werden public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); // clear the color and depth buffer gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -5.0f); ... } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/23
  • 16. Hidden Surface Determination Back-Face Culling Das Back-face Culling vermeidet das Zeichnen der R¨ckseiten von u Polygonen Das ist sinnvoll bei geschlossenen K¨rpern, die nur von außen o betrachtet werden k¨nnen o Ein Spezialfall tritt bei transparenten Objekten ein → blending // enable back-face culling gl.glEnable(GL.GL_CULL_FACE); ... // disable back-face culling gl.glDisable(GL.GL_CULL_FACE); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/23
  • 17. Hidden Surface Determination Back-Face Culling (Forts.) Zum Bestimmen der Vorder- und R¨ckseite eines Polygons wird u dessen Winding betrachtet Daher ist es wichtig das Polygon-Winding konsistent zu halten if(bCull) { // enable back-face culling gl.glEnable(GL.GL_CULL_FACE); } else { // disable back-face culling gl.glDisable(GL.GL_CULL_FACE); } Die Festlegung der Vorder- und R¨ckseiten geschieht mit der u Methode glFrontFace(int mode) // clockwise-wound polygons are front facing gl.glFrontFace(GL.GL_CW); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/23
  • 18. Geometrische Primitive Polygon Modes Polygone m¨ssen nicht grunds¨tzlich mit einer Farbe gef¨llt sein u a u Mit der Methode glPolygonMode(int face, int mode) l¨sst sich festlegen, a wie Polygone dargestellt werden sollen: GL.GL_POINT GL.GL_LINE GL.GL_FILL if(bOutline) { // draw polygons as outlines gl.glPolygonMode(GL.GL_BACK, GL_LINE) } else { // draw polygons solid gl.glPolygonMode(GL.GL_BACK, GL_FILL) } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/23
  • 19. Geometrische Primitive Konstruktionsregeln f¨r Polygone u Alle Polygone m¨ssen planar sein u Die Vertices eines Polygons m¨ssen immer in genau einer Ebene liegen u Bei Dreiecken ist das uberhaupt kein Problem ¨ Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/23
  • 20. Geometrische Primitive Konstruktionsregeln f¨r Polygone (Forts.) u Es darf keine Schnittpunkte zwischen den Kanten eines Polygons geben Polygone m¨ssen konvex sein: u Jede Strecke zweier Punkte des Polygons liegt vollst¨ndig in ihm a Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/23
  • 21. Grafikprogrammierung Ein etwas anderes Beispiel ... Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/23
  • 22. Literatur und Links Mason Woo, Jackie Neider, Tom Davis und 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 und Michael Sweet OpenGL SuperBibel http://www.starstonesoftware.com/OpenGL/ Tomas M¨ller und Eric Haines o Real-Time Rendering http://www.realtimerendering.com/ Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/23
  • 23. Literatur und Links Fletcher Dunn und 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/ Fairlight und The Black Lotus Only one wish http://capped.tv/playeralt.php?vid=1215051083-1-0 Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/23