Date post: | 26-Jun-2015 |
Category: |
Documents |
Upload: | johannes-diemke |
View: | 289 times |
Download: | 3 times |
C A R LV O N
O S S I E T Z K Y
Einfuhrung in JOGL 2.0
Johannes Diemke
Ubung im Modul OpenGL mit JavaWintersemester 2010/2011
Einfuhrung
OpenGL
Open Graphics Library
Spezifikation fur ein plattformunabhangiges API fur 2D- und3D-Computergrafik
Ist als Zustandsautomat entworfen
Dient als Schnittstelle zwischen Benutzer und Grafikkarte
Im professionellen Bereich als 3D-Standard fuhrend
Aktuelle Version: 4.1 (26. Juli 2010)
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 2/26
Einfuhrung
Java Bindings for OpenGLErmoglichen Java Programmen die Nutzung der OpenGL API
I Wrapperklassen stellen die Schnittstelle bereitI Nutzten das Java Native Interface
Der Grafikcode gleicht dem von C/C++ OpenGL Programmen
I Einfache Portierung bestehender OpenGL ProgrammeI JOGL lernen ist im Wesentlichen OpenGL lernen
Eroffnet neue Einsatzgebiete fur Java
I 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
Einfuhrung
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 eingestuftenFunktionalitat der fixed function pipeline aus der API entfernt
Mit JOGL 2.0 wurden daher Profile als Abstraktion derverschiedenen OpenGL Versionen eingefuhrt
Weiterhin wurde eine geringfugige Refaktorierung der APIdurchgefuhrt
Programme die OpenGL > 2.1 verwenden wollen benotigen daherJOGL 2.0
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 4/26
Einfuhrung
Installation von JOGL 2.0
1 JOGL 2.0 setzt eine vorhandene Installation des JDK voraus
I http://java.sun.com/
2 Um JOGL 2.0 verwenden zu konnen, mussen die benotigtenBibliotheken von JogAmp bezogen werden
I http://jogamp.com/
3 Als nachstes muss das Archiv mit den Bibliotheken in ein beliebigesVerzeichnis entpackt werden
I Bspw. /home/trigger/lib/jogl-2.0-pre-20101001-linux-i586I Im Unterverzeichnis ./lib befinden sich die JOGL 2.0 JAR Dateien
sowie dazugehorige native Bibliotheken
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 5/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Erstellen der User Library jogl-2.0 fur die JOGL BibliothekWindow I Preferences I Java I Build Path I User Libraries I New. . .
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 6/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Erstellen der User Library jogl-2.0 fur die JOGL BibliothekWindow I Preferences I Java I Build Path I User Libraries I New. . .
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 7/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Hinzufugen der JOGL 2.0 JARsjogl.all.jar, gluegen-rt.jar, nativewindow.all.jar, newt.all.jar
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 8/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Setzen der Native library location der hinzugefugten JARsNative library location I Edit. . .I External Folder. . .
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 9/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Hinzufugen der jogl-2.0 User Library zu einem bestehenden ProjektProperties I Java Build Path I Libraries I Add Library. . .I User Library
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 10/26
Einfuhrung
Installation von JOGL 2.0 (Forts.)
4 Konfiguration der Eclipse IDE zur Verwendung von JOGL 2.0
I Hinzufugen der jogl-2.0 User Library zu einem bestehenden ProjektProperties I Java Build Path I Libraries I Add Library. . . I User Library
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 11/26
Einfuhrung
Erstellung einer einfachen JOGL 2.0 Applikation
Ziel ist eine Applikation, die ein Fenster offnet in welches gerendertwerden kann
Alternative Moglichkeiten OpenGL Zeichenflachen zu erzeugen
I GLCanvas (AWT)I GLJPanel (Swing)I GLWindow (NEWT API, Bestandteil von JOGL 2.0)
Vorgehen bei Verwendung des AWT
1 Wahl eines GLProfile2 Konfiguration der GLCapabilities3 Erstellen eines GLCanvas4 Implementieren des GLEventListener5 Hinzufugen des GLCanvas zu einem AWT Frame6 Erstellen eines Animator-Threads
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 12/26
Einfuhrung
Schritt 1: Wahl eines GLProfile
JOGL 2.0 unterstutzt verschiedene OpenGL Profile
Vor der Entwicklung einer JOGL 2.0 Applikation muss zunachst einGLProfile gewahlt werden
Aktuell unterstutzte Profile:
I 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
Einfuhrung
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 musszwingend 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
Einfuhrung
Einschub: GLContextAnschaulich: Beschreibt Eigenschaften einer OpenGL Zeichenflache
I OpenGL VersionI Farbformat, OpenGL Zustand, . . .
Schritt 2: Konfiguration der GLCapabilities
Ein GLCapabilities Objekt beschreibt die gewunschten Fahigkeiteneines 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
Einfuhrung
Schritt 3: Erstellen eines GLCanvasEin GLCanvas ist eine mit AWT kompatible OpenGL Zeichenflache
I Erstellt und verwaltet selbststandig seinen GLContextI 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
Einfuhrung
Schritt 4: Implementieren des GLEventListener
Damit in ein GLDrawable gerendert werden kann, muss dasGLEventListener Interface implementiert und angemeldet werden
Daraufhin ist es moglich auf Rendering-Events des GLDrawable zureagieren
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
Einfuhrung
Schritt 4: Implementieren des GLEventListener (Forts.)Die init-Methode wird nach der Erzeugung des GLContextaufgerufen
I Passiert bspw. wenn ein GLCanvas erstellt wird
Wird daher haufig zur Initialisierung von OpenGL genutztI LichterI ShadeModelI . . .
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
Einfuhrung
Schritt 4: Implementieren des GLEventListener (Forts.)Die display-Methode wird von dem GLDrawable aufgerufen, wennein 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
Einfuhrung
Schritt 4: Implementieren des GLEventListener (Forts.)Die reshape-Methode wird von dem GLDrawable nach einemResize-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
Einfuhrung
Schritt 4: Implementieren des GLEventListener (Forts.)
Die dispose-Methode wird von dem GLDrawable vor dem Zerstorendes GLContext aufgerufen
Hier sollen eigentlich OpenGL Ressourcen destruiert werden
I TexturenI Shader ProgrammeI . . .
Benutzt aber niemand
public void dispose(GLAutoDrawable drawable) {
}
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 21/26
Einfuhrung
Schritt 5: Hinzufugen 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
Einfuhrung
Schritt 6: Erstellen eines Animator-ThreadsDie display-Methode des GLDrawable wird standardmaßigaufgerufen wenn:
I Resize-Events auftretenI Bedeckte Bereiche des Frames wieder sichtbar werden
Um die display-Methode wiederholt aufzurufen ist einAnimator-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
Einfuhrung
Schritt 6: Erstellen eines Animator-Threads (Forts.)
Animator.stop() ist blockierend und kann im AWT Thread zuDeadlocks fuhren
Daher sollte der Aufruf einem eigenen Thread ausgefuhrt 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
Einfuhrung
Das Ergebnis
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 25/26
Literatur
� Dave ShreinerOpenGL Programming Guidehttp://www.opengl-redbook.com/
� Richard S. Wright, Benjamin Lipchak und Nicholas HaemelOpenGL SuperBibelhttp://www.starstonesoftware.com/OpenGL/
� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/
� Tomas Akenine-Moller, Eric Haines und Naty HoffmanReal-Time Renderinghttp://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2010 / 2011 26/26