C A R L V O N O S S I E T Z K Y Einführung in JOGL 2.0 Johannes Diemke Übung im Modul OpenGL mit Java Wintersemester 2010/2011
OpenGL Open Graphics Library Spezifikation für ein plattformunabhängiges API für 2D- und 3D-Computergrafik Ist als Zustandsautomat entworfen Dient als Schnittstelle zwischen Benutzer und Grafikkarte Im professionellen Bereich als 3D-Standard führend Aktuelle Version: 4.1 (26. Juli 2010) Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
Java Bindings for OpenGL Ermöglichen Java Programmen die Nutzung der OpenGL API 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 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
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 Mit JOGL 2.0 wurden daher Profile als Abstraktion der verschiedenen OpenGL Versionen eingeführt Weiterhin wurde eine geringfügige Refaktorierung der API durchgeführt Programme die OpenGL > 2.1 verwenden wollen benötigen daher JOGL 2.0 Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
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 Bibliotheken von JogAmp bezogen werden http://jogamp.com/ 3 Als nächstes muss das Archiv mit den Bibliotheken in ein beliebiges 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 Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
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 Window Preferences Java Build Path User Libraries New... Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
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 Window Preferences Java Build Path User Libraries New... Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
Installation von JOGL 2.0 (Forts.) 4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0 Hinzufügen der JOGL 2.0 JARs jogl.all.jar, gluegen-rt.jar, nativewindow.all.jar, newt.all.jar Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
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 Native library location Edit... External Folder... Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
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 Properties Java Build Path Libraries Add Library... User Library Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
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 Properties Java Build Path Libraries Add Library... User Library Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
Erstellung einer einfachen JOGL 2.0 Applikation Ziel ist eine Applikation, die ein Fenster öffnet in welches gerendert werden kann Alternative Möglichkeiten OpenGL Zeichenflächen zu erzeugen 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 6 Erstellen eines Animator-Threads Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
Schritt 1: Wahl eines GLProfile JOGL 2.0 unterstützt verschiedene OpenGL Profile Vor der Entwicklung einer JOGL 2.0 Applikation muss zunächst ein GLProfile gewählt werden Aktuell unterstützte Profile: 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
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
Einschub: GLContext Anschaulich: Beschreibt Eigenschaften einer OpenGL Zeichenfläche OpenGL Version Farbformat, OpenGL Zustand,... Schritt 2: Konfiguration der GLCapabilities Ein GLCapabilities Objekt beschreibt die gewünschten Fähigkeiten 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
Schritt 3: Erstellen eines GLCanvas Ein GLCanvas ist eine mit AWT kompatible OpenGL Zeichenfläche Erstellt und verwaltet selbstständig seinen GLContext 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
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 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
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 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
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
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
Schritt 4: Implementieren des GLEventListener (Forts.) Die dispose-methode wird von dem GLDrawable vor dem Zerstören 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
Schritt 5: Hinzufügen des GLCanvas zu einem AWT Frame 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
Schritt 6: Erstellen eines Animator-Threads Die display-methode des GLDrawable wird standardmäßig 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
Schritt 6: Erstellen eines Animator-Threads (Forts.) Animator.stop() ist blockierend und kann im AWT Thread zu Deadlocks führen Daher sollte der Aufruf einem eigenen Thread ausgeführt werden 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
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 Real-Time Rendering http://www.realtimerendering.com/ Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26