문제

Java SWT 애플리케이션의 성능을 향상시키려고 노력 중인데 SWT에서 OpenGL을 사용할 수 있다는 것을 방금 알게 되었습니다.OpenGL에 대한 Java 바인딩이 두 개 이상인 것 같습니다.어느 것을 더 선호 해?

저는 이전에 OpenGL을 사용해 본 적이 없으며 응용 프로그램은 Windows, Linux 및 Mac OS X에서 작동해야 합니다.

도움이 되었습니까?

해결책

조글

내 이유는 이전에 링크된 사이트에서 인용할 수 있습니다.

JOGL은 OpenGL 2.0 사양의 API와 거의 모든 공급업체 확장에 대한 전체 액세스를 제공하고 AWT 및 Swing 위젯 세트와 통합됩니다.

또한, 재미있게 학습하고 파고들고 싶다면, 처리 시작하는 훌륭한 방법입니다. (처리에는 JOGL도 사용됩니다. btw...)

다른 팁

확인해 보시는 걸 추천드려요 LWJGL, LightWeight Java 게임 라이브러리.OpenGL 바인딩이 있지만 OpenAL 바인딩과 시작하는 데 도움이 되는 몇 가지 훌륭한 튜토리얼도 있습니다.

Swing/SWT와 OpenGL은 일반적으로 완전히 다른 용도로 사용된다는 점을 명심하세요.결국 두 가지를 조합하여 사용하고 싶을 수도 있습니다.LWJGL을 시험해보고 그것이 당신이 하고 있는 일과 얼마나 잘 어울리는지 확인해 보세요.

JOGL은 아마도 고려할 가치가 있는 유일한 옵션일 것입니다.이를 SWT 애플리케이션에 통합하는 데는 최소한 두 가지 옵션이 있습니다.SWT에 속하는 GLCanvas와 AWT에 속하는 GLCanvas가 있습니다.SWT의 기능은 완전한 기능이 아니며 실제로 유지 관리되지 않습니다.SWT_AWT 컨테이너 내부에서 AWT GLCanvas를 사용하는 것이 훨씬 좋습니다.최근 프로젝트의 일부 코드:

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은 최고의 성능과 휴대성을 제공합니다.하지만 OpenGL을 배우는 것과 본질적으로 동일한 JOGL을 배우는 것은 쉽지 않다는 점을 명심하세요.

개인적으로 저는 OpenGL 이외의 Java 바인딩에 대해 알지 못합니다. 조글 -- JOGL은 거의 Java OpenGL의 표준이라고 생각합니다.

Windows, Linux 및 OS X에서 작동하지만 각 플랫폼의 특정 문제에 대한 참고 사항은 공식 문서를 읽어보는 것이 좋습니다.

OpenGL 패러다임은 Swing/AWT 또는 Java 2D API와 상당히 다르다는 점을 명심하십시오.OpenGL은 Swing을 즉시 대체할 수 없습니다.

우리는 JOGL을 사용하여 직장에서 많은 행운을 누렸습니다.새로운 2.0 버전은 다음 위치에 있습니다. http://jogamp.org/ (마지막 "이전" 버전은 http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/).

특히 SWT가 포함된 JOGL 2의 경우 다음에서 시작하는 일련의 튜토리얼이 있습니다. http://wadeawalker.wordpress.com/2010/10/09/tutorial-a-cross-platform-workbench-program-using-java-opengl-and-eclipse/ 이는 설치 가능한 기본 바이너리를 갖춘 크로스 플랫폼 JOGL SWT 애플리케이션을 만드는 방법을 정확하게 보여줍니다.

또는 Eclipse RCP를 사용하고 싶지 않은 경우 JOGL 2 및 SWT를 사용하여 하나의 삼각형을 그리는 더 간단한 예가 있습니다.빌드하려면 swt.jar을 사용하여 프로젝트에 넣으세요(from http://www.eclipse.org/swt/) 및 최신 JOGL 자동 빌드 .jar 및 .dll 파일( http://jogamp.org/).이 간단한 예제의 유일한 문제점은 추가적인 도움 없이는 크로스 플랫폼이 될 수 없다는 것입니다. 여러 플랫폼 라이브러리 세트를 하나의 프로젝트로 묶을 수 있도록 Eclipse RCP가 제공하는 기능이 필요합니다.

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();        
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top