SlideShare ist ein Scribd-Unternehmen logo
CARL
      VON
OSSIETZKY
            Einf¨hrung in JOGL 2.0
                u

            Johannes Diemke

            ¨
            Ubung im Modul OpenGL mit Java
            Wintersemester 2010/2011
Einf¨hrung
    u


OpenGL
   Open Graphics Library
   Spezifikation f¨r ein plattformunabh¨ngiges API f¨r 2D- und
                 u                    a            u
   3D-Computergrafik
   Ist als Zustandsautomat entworfen
   Dient als Schnittstelle zwischen Benutzer und Grafikkarte
   Im professionellen Bereich als 3D-Standard f¨hrend
                                               u
   Aktuelle Version: 4.1 (26. Juli 2010)




   Johannes Diemke            OpenGL mit Java           WiSe 2010 / 2011   2/26
Einf¨hrung
    u


Java Bindings for OpenGL
   Erm¨glichen Java Programmen die Nutzung der OpenGL API
      o
         Wrapperklassen stellen die Schnittstelle bereit
         Nutzten das Java Native Interface
   Der Grafikcode gleicht dem von C/C++ OpenGL Programmen
         Einfache Portierung bestehender OpenGL Programme
         JOGL lernen ist im Wesentlichen OpenGL lernen
   Er¨ffnet neue Einsatzgebiete f¨r Java
     o                          u
         Computerspiele, VR, CAD, Simulationen, . . .

Versionen
   Stable Release:        JOGL 1.1.1 (22. Mai 2008)
   Preview Release:       JOGL 2.0 PRE 20101001 (30. Sept. 2010)


   Johannes Diemke               OpenGL mit Java           WiSe 2010 / 2011   3/26
Einf¨hrung
    u


Warum JOGL 2.0?
   JOGL 1.1.1 wurde nur bis OpenGL 2.1 entwickelt
   Ab OpenGL 3.1 ist ein Großteil der als deprecated eingestuften
   Funktionalit¨t der fixed function pipeline aus der API entfernt
               a
   Mit JOGL 2.0 wurden daher Profile als Abstraktion der
   verschiedenen OpenGL Versionen eingef¨hrt
                                        u
   Weiterhin wurde eine geringf¨gige Refaktorierung der API
                               u
   durchgef¨hrt
           u
   Programme die OpenGL > 2.1 verwenden wollen ben¨tigen daher
                                                  o
   JOGL 2.0




   Johannes Diemke           OpenGL mit Java         WiSe 2010 / 2011   4/26
Einf¨hrung
    u


Installation von JOGL 2.0
 1   JOGL 2.0 setzt eine vorhandene Installation des JDK voraus
           http://java.sun.com/
 2   Um JOGL 2.0 verwenden zu k¨nnen, m¨ssen die ben¨tigten
                                o        u          o
     Bibliotheken von JogAmp bezogen werden
           http://jogamp.com/
 3   Als n¨chstes muss das Archiv mit den Bibliotheken in ein beliebiges
          a
     Verzeichnis entpackt werden
           Bspw. /home/trigger/lib/jogl-2.0-pre-20101001-linux-i586
           Im Unterverzeichnis ./lib befinden sich die JOGL 2.0 JAR Dateien
           sowie dazugeh¨rige native Bibliotheken
                        o




     Johannes Diemke            OpenGL mit Java          WiSe 2010 / 2011   5/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Erstellen der User Library jogl-2.0 f¨r die JOGL Bibliothek
                                                u
           Window      Preferences   Java      Build Path   User Libraries     New. . .




     Johannes Diemke                 OpenGL mit Java               WiSe 2010 / 2011       6/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Erstellen der User Library jogl-2.0 f¨r die JOGL Bibliothek
                                                u
           Window      Preferences   Java      Build Path   User Libraries     New. . .




     Johannes Diemke                 OpenGL mit Java               WiSe 2010 / 2011       7/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Hinzuf¨gen der JOGL 2.0 JARs
                 u
           jogl.all.jar, gluegen-rt.jar, nativewindow.all.jar, newt.all.jar




     Johannes Diemke                   OpenGL mit Java                  WiSe 2010 / 2011   8/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Setzen der Native library location der hinzugef¨gten JARs
                                                          u
           Native library location   Edit. . .   External Folder. . .




     Johannes Diemke                 OpenGL mit Java                    WiSe 2010 / 2011   9/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Hinzuf¨gen der jogl-2.0 User Library zu einem bestehenden Projekt
                 u
           Properties   Java Build Path    Libraries   Add Library. . .    User Library




     Johannes Diemke               OpenGL mit Java                WiSe 2010 / 2011    10/26
Einf¨hrung
    u


Installation von JOGL 2.0 (Forts.)
 4   Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
           Hinzuf¨gen der jogl-2.0 User Library zu einem bestehenden Projekt
                 u
           Properties   Java Build Path    Libraries   Add Library. . .     User Library




     Johannes Diemke               OpenGL mit Java                WiSe 2010 / 2011    11/26
Einf¨hrung
    u


Erstellung einer einfachen JOGL 2.0 Applikation
   Ziel ist eine Applikation, die ein Fenster ¨ffnet in welches gerendert
                                              o
   werden kann
   Alternative M¨glichkeiten OpenGL Zeichenfl¨chen zu erzeugen
                  o                              a
          GLCanvas (AWT)
          GLJPanel (Swing)
          GLWindow (NEWT API, Bestandteil von JOGL 2.0)
   Vorgehen bei Verwendung des AWT
      1   Wahl eines GLProfile
      2   Konfiguration der GLCapabilities
      3   Erstellen eines GLCanvas
      4   Implementieren des GLEventListener
      5   Hinzuf¨gen des GLCanvas zu einem AWT Frame
                 u
      6   Erstellen eines Animator-Threads


    Johannes Diemke           OpenGL mit Java          WiSe 2010 / 2011   12/26
Einf¨hrung
    u


Schritt 1: Wahl eines GLProfile
   JOGL 2.0 unterst¨tzt verschiedene OpenGL Profile
                   u
   Vor der Entwicklung einer JOGL 2.0 Applikation muss zun¨chst ein
                                                          a
   GLProfile gew¨hlt werden
                a
   Aktuell unterst¨tzte Profile:
                  u
          GL4bc            (4.x, mit x ≥ 0, d. h. GL2 plus GL4)
          GL4              (4.x, mit x ≥ 0)
          GL3bc            (3.x, mit x ≥ 1, d. h. GL2 plus GL3)
          GL3              (3.x, mit x ≥ 1)
          GL2              (1.x bis zu 3.0)
          GLES1            (ES 1.x, mit x ≥ 0)
          GLES2            (ES 2.x, mit x ≥ 0)
          GL2ES1           (GL2 ∩ ES1)
          GL2ES2           (GL3 ∩ GL2 ∩ ES2)
          GL2GL3           (GL3 ∩ GL2)
    Johannes Diemke         OpenGL mit Java           WiSe 2010 / 2011   13/26
Einf¨hrung
    u


Schritt 1: Wahl eines GLProfile (Forts.)
   OpenGL 1.x bis zu 3.0
   GLProfile glp = GLProfile.get(GLProfile.GL2);

   Die statische Methode initSingleton der Klasse GLProfile muss
   zwingend vor allen anderen Methodenaufrufen aufgerufen werden
   public class JOGL2Basecode {

      public static void main(String[] args) {
        // It is mandatory to call this methods ASAP, before
        // anything else.
        GLProfile.initSingleton();

         GLProfile glp = GLProfile.get(GLProfile.GL2);




    Johannes Diemke               OpenGL mit Java          WiSe 2010 / 2011   14/26
Einf¨hrung
    u


Einschub: GLContext
     Anschaulich: Beschreibt Eigenschaften einer OpenGL Zeichen߬che
                                                                a
           OpenGL Version
           Farbformat, OpenGL Zustand, . . .
Schritt 2: Konfiguration der GLCapabilities
     Ein GLCapabilities Objekt beschreibt die gew¨nschten F¨higkeiten
                                                 u         a
     eines GLContext
public class JOGL2Basecode {

  public static void main(String[] args) {
    GLProfile.initSingleton();
    GLProfile glp = GLProfile.getDefault();

   // configure context
   GLCapabilities caps = new GLCapabilities(glp);


     Johannes Diemke              OpenGL mit Java     WiSe 2010 / 2011   15/26
Einf¨hrung
    u


Schritt 3: Erstellen eines GLCanvas
     Ein GLCanvas ist eine mit AWT kompatible OpenGL Zeichen߬che
                                                             a
           Erstellt und verwaltet selbstst¨ndig seinen GLContext
                                          a
           Implementiert das GLDrawable Interface


public class JOGL2Basecode {

  public static void main(String[] args) {
    GLProfile.initSingleton();
    GLProfile glp = GLProfile.getDefault();

   // configure context
   GLCapabilities caps = new GLCapabilities(glp);

   // a canvas based on your OpenGL capabilities
   GLCanvas canvas = new GLCanvas(caps);



     Johannes Diemke              OpenGL mit Java            WiSe 2010 / 2011   16/26
Einf¨hrung
    u


Schritt 4: Implementieren des GLEventListener
   Damit in ein GLDrawable gerendert werden kann, muss das
   GLEventListener Interface implementiert und angemeldet werden
   Daraufhin ist es m¨glich auf Rendering-Events des GLDrawable zu
                     o
   reagieren

   public class JOGL2Basecode implements GLEventListener {

      public static void main(String[] args) {
        GLProfile.initSingleton();
        GLProfile glp = GLProfile.getDefault();

         GLCapabilities caps = new GLCapabilities(glp);
         GLCanvas canvas = new GLCanvas(caps);
         canvas.addGLEventListener(new JOGL2Basecode());



    Johannes Diemke              OpenGL mit Java             WiSe 2010 / 2011   17/26
Einf¨hrung
    u


Schritt 4: Implementieren des GLEventListener (Forts.)
       Die init-Methode wird nach der Erzeugung des GLContext
       aufgerufen
             Passiert bspw. wenn ein GLCanvas erstellt wird
       Wird daher h¨ufig zur Initialisierung von OpenGL genutzt
                   a
             Lichter
             ShadeModel
             ...
public void init(GLAutoDrawable drawable) {
  GL2 gl = drawable.getGL().getGL2();

    // synchronize with the refresh rate of the display (v-sync)
    gl.setSwapInterval(1);
    gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
    gl.glShadeModel(GL2.GL_SMOOTH);
    gl.glEnable(GL2.GL_DEPTH_TEST);
}

       Johannes Diemke              OpenGL mit Java           WiSe 2010 / 2011   18/26
Einf¨hrung
    u


Schritt 4: Implementieren des GLEventListener (Forts.)
       Die display-Methode wird von dem GLDrawable aufgerufen, wenn
       ein Neuzeichen notwendig wird
public void display(GLAutoDrawable drawable) {
  GL2 gl = drawable.getGL().getGL2();

    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -10.0f);

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

    gl.glBegin(GL2.GL_QUADS);
      gl.glVertex3f(-1.0f, -1.0f, 2.0f);
      gl.glVertex3f(1.0f, -1.0f, 0.0f);
      gl.glVertex3f(1.0f, 1.0f, 0.0f);
      gl.glVertex3f(-1.0f, 1.0f, 2.0f);
    gl.glEnd();
}

       Johannes Diemke             OpenGL mit Java            WiSe 2010 / 2011   19/26
Einf¨hrung
    u


Schritt 4: Implementieren des GLEventListener (Forts.)
       Die reshape-Methode wird von dem GLDrawable nach einem
       Resize-Event aufgerufen
public void reshape(GLAutoDrawable drawable, int x, int y, int width,
        int height) {
  GL2 gl = drawable.getGL().getGL2();
  GLU glu = new GLU();

    if (height == 0) {
      height = 1;
    }

    float aspect = (float) width / (float) height;
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(45.0f, aspect, 0.1f, 100.0f);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
}

       Johannes Diemke             OpenGL mit Java          WiSe 2010 / 2011   20/26
Einf¨hrung
    u


Schritt 4: Implementieren des GLEventListener (Forts.)
     Die dispose-Methode wird von dem GLDrawable vor dem Zerst¨ren
                                                                o
     des GLContext aufgerufen
     Hier sollen eigentlich OpenGL Ressourcen destruiert werden
           Texturen
           Shader Programme
           ...
     Benutzt aber niemand

public void dispose(GLAutoDrawable drawable) {

}




     Johannes Diemke             OpenGL mit Java   WiSe 2010 / 2011   21/26
Einf¨hrung
    u


Schritt 5: Hinzuf¨gen des GLCanvas zu einem AWT Frame
                 u
public static void main(String[] args) {
  GLProfile.initSingleton();
  GLProfile glp = GLProfile.get(GLProfile.GL2);
  GLCapabilities caps = new GLCapabilities(glp);
  GLCanvas canvas = new GLCanvas(caps);
  canvas.addGLEventListener(new JOGL2Basecode());

    Frame frame = new Frame("JOGL2Basecode");
    frame.add(canvas);
    frame.setSize(640, 480);

    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    frame.setVisible(true);
}

       Johannes Diemke             OpenGL mit Java   WiSe 2010 / 2011   22/26
Einf¨hrung
    u


Schritt 6: Erstellen eines Animator-Threads
      Die display-Methode des GLDrawable wird standardm¨ßig
                                                       a
      aufgerufen wenn:
            Resize-Events auftreten
            Bedeckte Bereiche des Frames wieder sichtbar werden
      Um die display-Methode wiederholt aufzurufen ist ein
      Animator-Thread notwendig
Frame frame = new Frame("JOGL2Basecode");
frame.add(canvas);
frame.setSize(640, 480);

final Animator animator = new Animator(canvas);

...

frame.setVisible(true);
animator.start();

      Johannes Diemke             OpenGL mit Java          WiSe 2010 / 2011   23/26
Einf¨hrung
    u


Schritt 6: Erstellen eines Animator-Threads (Forts.)
     Animator.stop() ist blockierend und kann im AWT Thread zu
     Deadlocks f¨hren
                u
     Daher sollte der Aufruf einem eigenen Thread ausgef¨hrt werden
                                                        u
frame.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
    new Thread(new Runnable() {
      public void run() {
        animator.stop();
        System.exit(0);
      }
    }).start();
  }
});

frame.setVisible(true);
animator.start();


     Johannes Diemke             OpenGL mit Java     WiSe 2010 / 2011   24/26
Einf¨hrung
    u


Das Ergebnis




   Johannes Diemke   OpenGL mit Java   WiSe 2010 / 2011   25/26
Literatur


 Dave Shreiner
 OpenGL Programming Guide
 http://www.opengl-redbook.com/
 Richard S. Wright, Benjamin Lipchak und Nicholas Haemel
 OpenGL SuperBibel
 http://www.starstonesoftware.com/OpenGL/
 Randi J. Rost
 OpenGL Shading Language
 http://www.3dshaders.com/
 Tomas Akenine-M¨ller, Eric Haines und Naty Hoffman
                o
 Real-Time Rendering
 http://www.realtimerendering.com/

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

Weitere ähnliche Inhalte

Ähnlich wie 2010-JOGL-02-Einfuehrung

Die Java Plattform Strategie
Die Java Plattform StrategieDie Java Plattform Strategie
Die Java Plattform Strategie
Java Usergroup Berlin-Brandenburg
 
Java FX8 JumpStart - JUG ch - zürich
Java FX8   JumpStart - JUG ch - zürichJava FX8   JumpStart - JUG ch - zürich
Java FX8 JumpStart - JUG ch - zürich
Sven Ruppert
 
Rich Graphics & OpenGL mit Android
Rich Graphics & OpenGL mit AndroidRich Graphics & OpenGL mit Android
Rich Graphics & OpenGL mit Android
Dominik Helleberg
 
JavaMagazin - AngularJS
JavaMagazin - AngularJSJavaMagazin - AngularJS
JavaMagazin - AngularJS
Philipp Burgmer
 
2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading
Johannes Diemke
 
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Wolfgang Weigend
 
Introduction to JEE
Introduction to JEEIntroduction to JEE
Introduction to JEE
guestc44b7b
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007
smancke
 
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
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
Andreas Koop
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
enpit GmbH & Co. KG
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
Christoph Pickl
 
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
adesso AG
 
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergehtDas 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Wolfgang Weigend
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
gedoplan
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
gedoplan
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
gueste4be40
 
Jakarta EE 10: Was gibt es Neues?
Jakarta EE 10: Was gibt es Neues?Jakarta EE 10: Was gibt es Neues?
Jakarta EE 10: Was gibt es Neues?
gedoplan
 
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OPITZ CONSULTING Deutschland
 
OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021
OPITZ CONSULTING Deutschland
 

Ähnlich wie 2010-JOGL-02-Einfuehrung (20)

Die Java Plattform Strategie
Die Java Plattform StrategieDie Java Plattform Strategie
Die Java Plattform Strategie
 
Java FX8 JumpStart - JUG ch - zürich
Java FX8   JumpStart - JUG ch - zürichJava FX8   JumpStart - JUG ch - zürich
Java FX8 JumpStart - JUG ch - zürich
 
Rich Graphics & OpenGL mit Android
Rich Graphics & OpenGL mit AndroidRich Graphics & OpenGL mit Android
Rich Graphics & OpenGL mit Android
 
JavaMagazin - AngularJS
JavaMagazin - AngularJSJavaMagazin - AngularJS
JavaMagazin - AngularJS
 
2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading2010-JOGL-11-Toon-Shading
2010-JOGL-11-Toon-Shading
 
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
 
Introduction to JEE
Introduction to JEEIntroduction to JEE
Introduction to JEE
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007
 
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
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
WebLogic im Docker Container
WebLogic im Docker ContainerWebLogic im Docker Container
WebLogic im Docker Container
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
 
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
 
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergehtDas 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Jakarta EE 10: Was gibt es Neues?
Jakarta EE 10: Was gibt es Neues?Jakarta EE 10: Was gibt es Neues?
Jakarta EE 10: Was gibt es Neues?
 
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
OC|Webcast: Oracle Lizenzierung - Lizenznews 2021
 
OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021OC|Webcast "Java heute" vom 24.08.2021
OC|Webcast "Java heute" vom 24.08.2021
 

Mehr von Johannes Diemke

Polymorphie
PolymorphiePolymorphie
Polymorphie
Johannes Diemke
 
Prozedurale Texturen
Prozedurale TexturenProzedurale Texturen
Prozedurale Texturen
Johannes Diemke
 
Pfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen PotentialfeldernPfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen Potentialfeldern
Johannes Diemke
 
2010-JOGL-12-Projection-Shadows
2010-JOGL-12-Projection-Shadows2010-JOGL-12-Projection-Shadows
2010-JOGL-12-Projection-Shadows
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-06-Licht-und-Material
2010-JOGL-06-Licht-und-Material2010-JOGL-06-Licht-und-Material
2010-JOGL-06-Licht-und-Material
Johannes Diemke
 
2010-JOGL-05-Transformationen
2010-JOGL-05-Transformationen2010-JOGL-05-Transformationen
2010-JOGL-05-Transformationen
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 (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 2010
Johannes 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
 

Mehr von Johannes Diemke (20)

Polymorphie
PolymorphiePolymorphie
Polymorphie
 
Prozedurale Texturen
Prozedurale TexturenProzedurale Texturen
Prozedurale Texturen
 
Pfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen PotentialfeldernPfadplanung mit harmonischen Potentialfeldern
Pfadplanung mit harmonischen Potentialfeldern
 
2010-JOGL-12-Projection-Shadows
2010-JOGL-12-Projection-Shadows2010-JOGL-12-Projection-Shadows
2010-JOGL-12-Projection-Shadows
 
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-06-Licht-und-Material
2010-JOGL-06-Licht-und-Material2010-JOGL-06-Licht-und-Material
2010-JOGL-06-Licht-und-Material
 
2010-JOGL-05-Transformationen
2010-JOGL-05-Transformationen2010-JOGL-05-Transformationen
2010-JOGL-05-Transformationen
 
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 (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)
 

2010-JOGL-02-Einfuehrung

  • 1. CARL VON OSSIETZKY Einf¨hrung in JOGL 2.0 u Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
  • 2. Einf¨hrung u OpenGL Open Graphics Library Spezifikation f¨r ein plattformunabh¨ngiges API f¨r 2D- und u a u 3D-Computergrafik Ist als Zustandsautomat entworfen Dient als Schnittstelle zwischen Benutzer und Grafikkarte Im professionellen Bereich als 3D-Standard f¨hrend u Aktuelle Version: 4.1 (26. Juli 2010) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
  • 3. Einf¨hrung u Java Bindings for OpenGL Erm¨glichen Java Programmen die Nutzung der OpenGL API o Wrapperklassen stellen die Schnittstelle bereit Nutzten das Java Native Interface Der Grafikcode gleicht dem von C/C++ OpenGL Programmen Einfache Portierung bestehender OpenGL Programme JOGL lernen ist im Wesentlichen OpenGL lernen Er¨ffnet neue Einsatzgebiete f¨r Java o u Computerspiele, VR, CAD, Simulationen, . . . Versionen Stable Release: JOGL 1.1.1 (22. Mai 2008) Preview Release: JOGL 2.0 PRE 20101001 (30. Sept. 2010) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 3/26
  • 4. Einf¨hrung u Warum JOGL 2.0? JOGL 1.1.1 wurde nur bis OpenGL 2.1 entwickelt Ab OpenGL 3.1 ist ein Großteil der als deprecated eingestuften Funktionalit¨t der fixed function pipeline aus der API entfernt a Mit JOGL 2.0 wurden daher Profile als Abstraktion der verschiedenen OpenGL Versionen eingef¨hrt u Weiterhin wurde eine geringf¨gige Refaktorierung der API u durchgef¨hrt u Programme die OpenGL > 2.1 verwenden wollen ben¨tigen daher o JOGL 2.0 Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
  • 5. Einf¨hrung u Installation von JOGL 2.0 1 JOGL 2.0 setzt eine vorhandene Installation des JDK voraus http://java.sun.com/ 2 Um JOGL 2.0 verwenden zu k¨nnen, m¨ssen die ben¨tigten o u o Bibliotheken von JogAmp bezogen werden http://jogamp.com/ 3 Als n¨chstes muss das Archiv mit den Bibliotheken in ein beliebiges a Verzeichnis entpackt werden Bspw. /home/trigger/lib/jogl-2.0-pre-20101001-linux-i586 Im Unterverzeichnis ./lib befinden sich die JOGL 2.0 JAR Dateien sowie dazugeh¨rige native Bibliotheken o Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
  • 6. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Erstellen der User Library jogl-2.0 f¨r die JOGL Bibliothek u Window Preferences Java Build Path User Libraries New. . . Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
  • 7. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Erstellen der User Library jogl-2.0 f¨r die JOGL Bibliothek u Window Preferences Java Build Path User Libraries New. . . Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
  • 8. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Hinzuf¨gen der JOGL 2.0 JARs u jogl.all.jar, gluegen-rt.jar, nativewindow.all.jar, newt.all.jar Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
  • 9. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Setzen der Native library location der hinzugef¨gten JARs u Native library location Edit. . . External Folder. . . Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
  • 10. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Hinzuf¨gen der jogl-2.0 User Library zu einem bestehenden Projekt u Properties Java Build Path Libraries Add Library. . . User Library Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
  • 11. Einf¨hrung u Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Hinzuf¨gen der jogl-2.0 User Library zu einem bestehenden Projekt u Properties Java Build Path Libraries Add Library. . . User Library Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
  • 12. Einf¨hrung u Erstellung einer einfachen JOGL 2.0 Applikation Ziel ist eine Applikation, die ein Fenster ¨ffnet in welches gerendert o werden kann Alternative M¨glichkeiten OpenGL Zeichenfl¨chen zu erzeugen o a GLCanvas (AWT) GLJPanel (Swing) GLWindow (NEWT API, Bestandteil von JOGL 2.0) Vorgehen bei Verwendung des AWT 1 Wahl eines GLProfile 2 Konfiguration der GLCapabilities 3 Erstellen eines GLCanvas 4 Implementieren des GLEventListener 5 Hinzuf¨gen des GLCanvas zu einem AWT Frame u 6 Erstellen eines Animator-Threads Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
  • 13. Einf¨hrung u Schritt 1: Wahl eines GLProfile JOGL 2.0 unterst¨tzt verschiedene OpenGL Profile u Vor der Entwicklung einer JOGL 2.0 Applikation muss zun¨chst ein a GLProfile gew¨hlt werden a Aktuell unterst¨tzte Profile: u GL4bc (4.x, mit x ≥ 0, d. h. GL2 plus GL4) GL4 (4.x, mit x ≥ 0) GL3bc (3.x, mit x ≥ 1, d. h. GL2 plus GL3) GL3 (3.x, mit x ≥ 1) GL2 (1.x bis zu 3.0) GLES1 (ES 1.x, mit x ≥ 0) GLES2 (ES 2.x, mit x ≥ 0) GL2ES1 (GL2 ∩ ES1) GL2ES2 (GL3 ∩ GL2 ∩ ES2) GL2GL3 (GL3 ∩ GL2) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 13/26
  • 14. Einf¨hrung u Schritt 1: Wahl eines GLProfile (Forts.) OpenGL 1.x bis zu 3.0 GLProfile glp = GLProfile.get(GLProfile.GL2); Die statische Methode initSingleton der Klasse GLProfile muss zwingend vor allen anderen Methodenaufrufen aufgerufen werden public class JOGL2Basecode { public static void main(String[] args) { // It is mandatory to call this methods ASAP, before // anything else. GLProfile.initSingleton(); GLProfile glp = GLProfile.get(GLProfile.GL2); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 14/26
  • 15. Einf¨hrung u Einschub: GLContext Anschaulich: Beschreibt Eigenschaften einer OpenGL Zeichenfl¨che a OpenGL Version Farbformat, OpenGL Zustand, . . . Schritt 2: Konfiguration der GLCapabilities Ein GLCapabilities Objekt beschreibt die gew¨nschten F¨higkeiten u a eines GLContext public class JOGL2Basecode { public static void main(String[] args) { GLProfile.initSingleton(); GLProfile glp = GLProfile.getDefault(); // configure context GLCapabilities caps = new GLCapabilities(glp); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 15/26
  • 16. Einf¨hrung u Schritt 3: Erstellen eines GLCanvas Ein GLCanvas ist eine mit AWT kompatible OpenGL Zeichenfl¨che a Erstellt und verwaltet selbstst¨ndig seinen GLContext a Implementiert das GLDrawable Interface public class JOGL2Basecode { public static void main(String[] args) { GLProfile.initSingleton(); GLProfile glp = GLProfile.getDefault(); // configure context GLCapabilities caps = new GLCapabilities(glp); // a canvas based on your OpenGL capabilities GLCanvas canvas = new GLCanvas(caps); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 16/26
  • 17. Einf¨hrung u Schritt 4: Implementieren des GLEventListener Damit in ein GLDrawable gerendert werden kann, muss das GLEventListener Interface implementiert und angemeldet werden Daraufhin ist es m¨glich auf Rendering-Events des GLDrawable zu o reagieren public class JOGL2Basecode implements GLEventListener { public static void main(String[] args) { GLProfile.initSingleton(); GLProfile glp = GLProfile.getDefault(); GLCapabilities caps = new GLCapabilities(glp); GLCanvas canvas = new GLCanvas(caps); canvas.addGLEventListener(new JOGL2Basecode()); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 17/26
  • 18. Einf¨hrung u Schritt 4: Implementieren des GLEventListener (Forts.) Die init-Methode wird nach der Erzeugung des GLContext aufgerufen Passiert bspw. wenn ein GLCanvas erstellt wird Wird daher h¨ufig zur Initialisierung von OpenGL genutzt a Lichter ShadeModel ... public void init(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); // synchronize with the refresh rate of the display (v-sync) gl.setSwapInterval(1); gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f); gl.glShadeModel(GL2.GL_SMOOTH); gl.glEnable(GL2.GL_DEPTH_TEST); } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 18/26
  • 19. Einf¨hrung u Schritt 4: Implementieren des GLEventListener (Forts.) Die display-Methode wird von dem GLDrawable aufgerufen, wenn ein Neuzeichen notwendig wird public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -10.0f); gl.glColor3f(0.65f, 0.85f, 0.65f); gl.glBegin(GL2.GL_QUADS); gl.glVertex3f(-1.0f, -1.0f, 2.0f); gl.glVertex3f(1.0f, -1.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 2.0f); gl.glEnd(); } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 19/26
  • 20. Einf¨hrung u Schritt 4: Implementieren des GLEventListener (Forts.) Die reshape-Methode wird von dem GLDrawable nach einem Resize-Event aufgerufen public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { GL2 gl = drawable.getGL().getGL2(); GLU glu = new GLU(); if (height == 0) { height = 1; } float aspect = (float) width / (float) height; gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(45.0f, aspect, 0.1f, 100.0f); gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 20/26
  • 21. Einf¨hrung u Schritt 4: Implementieren des GLEventListener (Forts.) Die dispose-Methode wird von dem GLDrawable vor dem Zerst¨ren o des GLContext aufgerufen Hier sollen eigentlich OpenGL Ressourcen destruiert werden Texturen Shader Programme ... Benutzt aber niemand public void dispose(GLAutoDrawable drawable) { } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/26
  • 22. Einf¨hrung u Schritt 5: Hinzuf¨gen des GLCanvas zu einem AWT Frame u public static void main(String[] args) { GLProfile.initSingleton(); GLProfile glp = GLProfile.get(GLProfile.GL2); GLCapabilities caps = new GLCapabilities(glp); GLCanvas canvas = new GLCanvas(caps); canvas.addGLEventListener(new JOGL2Basecode()); Frame frame = new Frame("JOGL2Basecode"); frame.add(canvas); frame.setSize(640, 480); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 22/26
  • 23. Einf¨hrung u Schritt 6: Erstellen eines Animator-Threads Die display-Methode des GLDrawable wird standardm¨ßig a aufgerufen wenn: Resize-Events auftreten Bedeckte Bereiche des Frames wieder sichtbar werden Um die display-Methode wiederholt aufzurufen ist ein Animator-Thread notwendig Frame frame = new Frame("JOGL2Basecode"); frame.add(canvas); frame.setSize(640, 480); final Animator animator = new Animator(canvas); ... frame.setVisible(true); animator.start(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 23/26
  • 24. Einf¨hrung u Schritt 6: Erstellen eines Animator-Threads (Forts.) Animator.stop() ist blockierend und kann im AWT Thread zu Deadlocks f¨hren u Daher sollte der Aufruf einem eigenen Thread ausgef¨hrt werden u frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { new Thread(new Runnable() { public void run() { animator.stop(); System.exit(0); } }).start(); } }); frame.setVisible(true); animator.start(); Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 24/26
  • 25. Einf¨hrung u Das Ergebnis Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/26
  • 26. Literatur Dave Shreiner OpenGL Programming Guide http://www.opengl-redbook.com/ Richard S. Wright, Benjamin Lipchak und Nicholas Haemel OpenGL SuperBibel http://www.starstonesoftware.com/OpenGL/ Randi J. Rost OpenGL Shading Language http://www.3dshaders.com/ Tomas Akenine-M¨ller, Eric Haines und Naty Hoffman o Real-Time Rendering http://www.realtimerendering.com/ Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26