+ All Categories
Home > Documents > 2010-JOGL-02-Einfuehrung

2010-JOGL-02-Einfuehrung

Date post: 26-Jun-2015
Category:
Upload: johannes-diemke
View: 289 times
Download: 3 times
Share this document with a friend
26
C A R L V ON O SS I ET Z KY Einf¨ uhrung in JOGL 2.0 Johannes Diemke ¨ Ubung im Modul OpenGL mit Java Wintersemester 2010/2011
Transcript
Page 1: 2010-JOGL-02-Einfuehrung

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

Page 2: 2010-JOGL-02-Einfuehrung

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

Page 3: 2010-JOGL-02-Einfuehrung

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

Page 4: 2010-JOGL-02-Einfuehrung

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

Page 5: 2010-JOGL-02-Einfuehrung

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

Page 6: 2010-JOGL-02-Einfuehrung

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

Page 7: 2010-JOGL-02-Einfuehrung

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

Page 8: 2010-JOGL-02-Einfuehrung

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

Page 9: 2010-JOGL-02-Einfuehrung

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

Page 10: 2010-JOGL-02-Einfuehrung

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

Page 11: 2010-JOGL-02-Einfuehrung

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

Page 12: 2010-JOGL-02-Einfuehrung

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

Page 13: 2010-JOGL-02-Einfuehrung

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

Page 14: 2010-JOGL-02-Einfuehrung

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

Page 15: 2010-JOGL-02-Einfuehrung

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

Page 16: 2010-JOGL-02-Einfuehrung

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

Page 17: 2010-JOGL-02-Einfuehrung

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

Page 18: 2010-JOGL-02-Einfuehrung

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

Page 19: 2010-JOGL-02-Einfuehrung

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

Page 20: 2010-JOGL-02-Einfuehrung

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

Page 21: 2010-JOGL-02-Einfuehrung

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

Page 22: 2010-JOGL-02-Einfuehrung

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

Page 23: 2010-JOGL-02-Einfuehrung

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

Page 24: 2010-JOGL-02-Einfuehrung

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

Page 25: 2010-JOGL-02-Einfuehrung

Einfuhrung

Das Ergebnis

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

Page 26: 2010-JOGL-02-Einfuehrung

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


Recommended