Richard Craig - Research Engineer
 
 
By Richard Craig | Sunday, 6th Mar, 2011 | | 0 Comments |

After looking around for a great first OpenGL example in java using JoGL I came across a great post on Schabby’s Blog which I have blatantly copied from http://schabby.de/jogl-example-hello-world/

This getting started tutorial is intended for JOGL users that are mere beginners. It helps to setup a recent JOGL installation in Eclipse on Windows.

First you need to download JOGL. This is actually more difficult than it sounds because the precompiled binary packages are a bit hidden in the new project site. Fortunately, I figured out where you can download recent JOGL binaries.

So one you got the binaries, unpack the ZIP file somewhere. You will notice the lib folder with a number of DLL and JAR files. All you need is in that lib folder.

Create a new eclipse project (name doesnt matter) and add the following JARs on the classpath:

  • jogl.all.jar
  • nativewindow.all.jar
  • gluegen-rt.jar

Then, copy the following DLL files to the projects root directory (this is where your src folder lies in).

  • gluegen-rt.dll
  • jogl_desktop.dll
  • nativewindow_awt.dll

These files are the native part of the OpenGL binding and are linked via Java Native Interface (JNI). Since Eclipse starts all Programs with the working directory set to the project folder, the VM will find the DLLs when needed.

Once you got that set up, create a package de.schabby.jogl.helloworld and copypaste the following two classes in the newly created package.

package de.schabby.jogl.helloworld;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;

public class HelloWorld
{
    public static void main(String[] args)
    {
    	// setup OpenGL Version 2
    	GLProfile profile = GLProfile.get(GLProfile.GL2);
    	GLCapabilities capabilities = new GLCapabilities(profile);

    	// The canvas is the widget that's drawn in the JFrame
    	GLCanvas glcanvas = new GLCanvas(capabilities);
    	glcanvas.addGLEventListener(new Renderer());
    	glcanvas.setSize( 300, 300 );

        JFrame frame = new JFrame( "Hello World" );
        frame.getContentPane().add( glcanvas);

        // shutdown the program on windows close event
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });

        frame.setSize( frame.getContentPane().getPreferredSize() );
        frame.setVisible( true );
    }
}

The Render.java class looks like follows. It implements GLEventListener which is the call-back implementaiton by JOGL to do all OpenGL rendering.

package de.schabby.jogl.helloworld;

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

class Renderer implements GLEventListener
{
    private GLU glu = new GLU();

    public void display(GLAutoDrawable gLDrawable)
    {
        final GL2 gl = gLDrawable.getGL().getGL2();
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
        gl.glBegin(GL2.GL_TRIANGLES);
        gl.glVertex3f(0.0f, 1.0f, 0.0f);
        gl.glVertex3f(-1.0f, -1.0f, 0.0f);
        gl.glVertex3f(1.0f, -1.0f, 0.0f);
        gl.glEnd();
        gl.glTranslatef(3.0f, 0.0f, 0.0f);
        gl.glBegin(GL2.GL_QUADS);
        gl.glVertex3f(-1.0f, 1.0f, 0.0f);
        gl.glVertex3f(1.0f, 1.0f, 0.0f);
        gl.glVertex3f(1.0f, -1.0f, 0.0f);
        gl.glVertex3f(-1.0f, -1.0f, 0.0f);
        gl.glEnd();
        gl.glFlush();
    }

    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged)
    {
    	System.out.println("displayChanged called");
    }

    public void init(GLAutoDrawable gLDrawable)
    {
    	System.out.println("init() called");
        GL2 gl = gLDrawable.getGL().getGL2();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glShadeModel(GL2.GL_FLAT);
    }

    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
    {
    	System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
        final GL2 gl = gLDrawable.getGL().getGL2();

        if (height <= 0) // avoid a divide by zero error!
        {
            height = 1;
        }

        final float h = (float) width / (float) height;

        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, h, 1.0, 20.0);
        gl.glMatrixMode(GL2.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

	public void dispose(GLAutoDrawable arg0)
	{
		System.out.println("dispose() called");
	}
}

By right-clicking on the main() method and chosing “run as application”, eclipse will execute the program.

That’s it so far. Please let me know if you have questions or comments.

Similar Code Posts

Business Rules of Play

While reading about Peter R. Scholtes, I came across the Kelly Allen Associates website and their listed ‘Rules of Play’ page. Many of the rules of business are simple and obvious, yet are easy to overlook or break.

Read more...

Potential scale for EngD stakeholders

I’ve been thinking about a nice, quick and easy scale to base value decisions against a (potential) stakeholder’s relationship to the research project.

Read more...

Lean Working

I’m sure I’m not the only one who sometimes gets overloaded with work to be done. It can feel like waves of stress to get things done, trying to progress multiple jobs that just seem to hang around. After reading some more on LEAN principles again recently, I thought I’d give the LEAN approach to [...]

Read more...

.

.