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 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
16. 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
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