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

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