Frage

Ich versuche, eine bessere Leistung für meine Java SWT Anwendung zu erreichen, und ich habe gerade herausgefunden es ist möglich, OpenGL in SWT zu verwenden. Es scheint, gibt es mehr als eine Java für OpenGL Bindung. Welches bevorzugen Sie?

Beachten Sie, dass ich noch nie OpenGL verwendet haben, und dass die Anwendung muss auf Windows, Linux und Mac OS X arbeiten.

War es hilfreich?

Lösung

JOGL

Meine Gründe können aus der zuvor verlinkten Seite angegeben werden:

  

JOGL bietet vollen Zugriff auf die APIs in der OpenGL-2.0-Spezifikation sowie fast alle Erweiterungen des Herstellers und integriert mit der AWT und Widget-Sets Schwingen.

Auch wenn Sie etwas Spaß zu lernen und stochern haben wollen, Verarbeitung ist eine hervorragende Möglichkeit, zu starten (auch Verarbeitung verwendet JOGL btw ...)

Andere Tipps

Ich würde vorschlagen, Check-out LWJGL , das leichtgewichtige Java Spielsammlung. Es ist OpenGL Bindungen bekam, aber es hat auch OpenAL Bindings und einige große Tutorials Sie, um loszulegen.

Denken Sie daran, dass Swing / SWT und OpenGL sind für ganz andere Dinge verwendet. Sie können bis zu wollen am Ende eine Kombination aus beidem verwenden. Nur LWJGL ausprobieren und sehen, wie gut es passt mit dem, was Sie tun.

JOGL ist wahrscheinlich die einzige Option eine Überlegung wert. Beachten Sie, dass es mindestens zwei Möglichkeiten für sie in eine SWT-Anwendung zu integrieren. Es gibt eine GLCanvas, die SWT und einen GLCanvas gehört, die AWT gehört. Der in SWT ist nicht vollständig verfügen und ist nicht wirklich gepflegt. Es ist viel besser, die AWT GLCanvas in einem SWT_AWT Behälter zu verwenden. Einige Code aus einem aktuellen Projekt:

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

import javax.media.opengl.*;
import javax.media.opengl.glu.*;

import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.*;

public class Main implements GLEventListener
{
    public static void main(String[] args) 
    {
        Display display = new Display();
    Main main = new Main();
    main.runMain(display);
    display.dispose();
}

void runMain(Display display)
{
    final Shell shell = new Shell(display);
    shell.setText("Q*bert 3D - OpenGL Exercise");
    GridLayout gridLayout = new GridLayout();
    gridLayout.marginHeight = 0;
    gridLayout.marginWidth = 0;

    shell.setLayout(gridLayout);

    // this allows us to set particular properties for the GLCanvas
    GLCapabilities glCapabilities = new GLCapabilities();

    glCapabilities.setDoubleBuffered(true);
    glCapabilities.setHardwareAccelerated(true);

    // instantiate the canvas
    final GLCanvas canvas = new GLCanvas(glCapabilities);

    // we can't use the default Composite because using the AWT bridge
    // requires that it have the property of SWT.EMBEDDED
    Composite composite = new Composite(shell, SWT.EMBEDDED);
    GridData ld = new GridData(GridData.FILL_BOTH);
    composite.setLayoutData(ld);

    // set the internal layout so our canvas fills the whole control
    FillLayout clayout = new FillLayout();
    composite.setLayout(clayout);

    // create the special frame bridge to AWT
    java.awt.Frame glFrame = SWT_AWT.new_Frame(composite);
    // we need the listener so we get the GL events
    canvas.addGLEventListener(this);

    // finally, add our canvas as a child of the frame
    glFrame.add(canvas);

    // show it all
    shell.open();
    // the event loop.
    while (!shell.isDisposed ()) {
        if (!display.readAndDispatch ()) display.sleep ();
    }
}

JOGL geben Ihnen beste Leistung und Mobilität. Aber beachten Sie, dass JOGL Lernen, die im Wesentlichen das gleiche ist wie das Lernen OpenGL, ist nicht einfach.

Ich persönlich bin nicht einmal bewusst Java-Bindings für OpenGL andere als JOGL - ich denke, JOGL ist so ziemlich der Standard für Java OpenGL.

Es funktioniert unter Windows, Linux und OS X, aber Sie könnten über die offizielle Dokumentation für einige Anmerkungen zu bestimmten Themen in jeder Plattform lesen möchten.

Beachten Sie, dass das OpenGL-Paradigma von Swing / AWT oder dem Java 2D-API ist ganz anders; OpenGL ist nicht ein Drop-in-Ersatz für Swing.

Wir haben viel Glück bei der Arbeit mit JOGL haben. Die neue Version 2.0 ist unter http://jogamp.org/ (die letzte "alte" Version ist unter http://download.java.net/media/jogl/builds /archive/jsr-231-1.1.1a/ ).

Für JOGL 2 mit SWT gesagt, habe ich eine Reihe von Tutorials bekam ab http://wadeawalker.wordpress.com/2010/10/09/tutorial-a-cross-platform-workbench-program-using- java-opengl-and-eclipse / , die genau zeigt, wie Cross-Plattform JOGL SWT-Anwendungen zu machen, komplett mit installierbar nativen Binärdateien.

Oder wenn Sie Eclipse RCP nicht verwenden möchten, ist hier ein noch einfacheres Beispiel, das nur ein Dreieck zieht mit JOGL 2 und SWT. Für den Bau, steckt es in einem Projekt mit swt.jar (von http://www.eclipse.org/swt / ) und die neuesten JOGL Autobuild .jar und DLL-Dateien (von http://jogamp.org/). Das einzige Problem mit diesem einfachen Beispiel ist, dass es nicht Cross-Plattform ohne eine zusätzliche Hilfe sein wird -. Sie die Möglichkeit benötigen, dass Eclipse RCP Ihnen mehrere Sätze von Plattform-Bibliotheken zusammen in ein Projekt zu bündeln, gibt

package name.wadewalker.onetriangle;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

import javax.media.opengl.GL;
import javax.media.opengl.GLProfile;
import javax.media.opengl.GL2;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.glu.GLU;

public class OneTriangle {

    public static void main(String [] args) {
        GLProfile.initSingleton( true );

        GLProfile glprofile = GLProfile.get( GLProfile.GL2 );

        Display display = new Display();
        Shell shell = new Shell( display );
        shell.setLayout( new FillLayout() );
        Composite composite = new Composite( shell, SWT.NONE );
        composite.setLayout( new FillLayout() );

        GLData gldata = new GLData();
        gldata.doubleBuffer = true;
        // need SWT.NO_BACKGROUND to prevent SWT from clearing the window
        // at the wrong times (we use glClear for this instead)
        final GLCanvas glcanvas = new GLCanvas( composite, SWT.NO_BACKGROUND, gldata );
        glcanvas.setCurrent();
        final GLContext glcontext = GLDrawableFactory.getFactory( glprofile ).createExternalGLContext();

        // fix the viewport when the user resizes the window
        glcanvas.addListener( SWT.Resize, new Listener() {
            public void handleEvent(Event event) {
                setup( glcanvas, glcontext );
            }
        });

        // draw the triangle when the OS tells us that any part of the window needs drawing
        glcanvas.addPaintListener( new PaintListener() {
            public void paintControl( PaintEvent paintevent ) {
                render( glcanvas, glcontext );
            }
        });

        shell.setText( "OneTriangle" );
        shell.setSize( 640, 480 );
        shell.open();

        while( !shell.isDisposed() ) {
            if( !display.readAndDispatch() )
                display.sleep();
        }

        glcanvas.dispose();
        display.dispose();
    }

    private static void setup( GLCanvas glcanvas, GLContext glcontext ) {
        Rectangle rectangle = glcanvas.getClientArea();

        glcanvas.setCurrent();
        glcontext.makeCurrent();

        GL2 gl = glcontext.getGL().getGL2();
        gl.glMatrixMode( GL2.GL_PROJECTION );
        gl.glLoadIdentity();

        // coordinate system origin at lower left with width and height same as the window
        GLU glu = new GLU();
        glu.gluOrtho2D( 0.0f, rectangle.width, 0.0f, rectangle.height );

        gl.glMatrixMode( GL2.GL_MODELVIEW );
        gl.glLoadIdentity();

        gl.glViewport( 0, 0, rectangle.width, rectangle.height );
        glcontext.release();        
    }

    private static void render( GLCanvas glcanvas, GLContext glcontext ) {
        Rectangle rectangle = glcanvas.getClientArea();

        glcanvas.setCurrent();
        glcontext.makeCurrent();

        GL2 gl = glcontext.getGL().getGL2();
        gl.glClear( GL.GL_COLOR_BUFFER_BIT );

        // draw a triangle filling the window
        gl.glLoadIdentity();
        gl.glBegin( GL.GL_TRIANGLES );
        gl.glColor3f( 1, 0, 0 );
        gl.glVertex2f( 0, 0 );
        gl.glColor3f( 0, 1, 0 );
        gl.glVertex2f( rectangle.width, 0 );
        gl.glColor3f( 0, 0, 1 );
        gl.glVertex2f( rectangle.width / 2, rectangle.height );
        gl.glEnd();

        glcanvas.swapBuffers();
        glcontext.release();        
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top