Java SWT アプリケーションのパフォーマンスを向上させようとしていますが、SWT で OpenGL を使用できることがわかりました。OpenGL 用の Java バインディングが複数あるようです。あなたはどちらを好みますか?
私はこれまで OpenGL を使用したことがなく、アプリケーションは Windows、Linux、および Mac OS X で動作する必要があることに注意してください。
Java SWT アプリケーションのパフォーマンスを向上させようとしていますが、SWT で OpenGL を使用できることがわかりました。OpenGL 用の Java バインディングが複数あるようです。あなたはどちらを好みますか?
私はこれまで OpenGL を使用したことがなく、アプリケーションは Windows、Linux、および Mac OS X で動作する必要があることに注意してください。
LightWeightJavaゲームライブラリであるLWJGLをチェックすることをお勧めします。OpenGLバインディングがありますが、OpenALバインディングといくつかの優れたチュートリアルもあります。
Swing / SWTとOpenGLは、通常、まったく異なる目的で使用されることに注意してください。両方を組み合わせて使用したくなる場合があります。LWJGLを試してみて、自分がしていることにどれだけうまく適合するかを確認してください。
私の理由は、以前にリンクされたサイトから引用できます。
JOGL は、OpenGL 2.0 仕様の API およびほぼすべてのベンダー拡張機能へのフル アクセスを提供し、AWT および Swing ウィジェット セットと統合します。
また、楽しく学びたい場合は、Processingを開始するのが最適です (Processing も JOGL を使用します...)。
JOGLは、おそらく検討する価値のある唯一のオプションです。SWTアプリケーションに統合するためのオプションが少なくとも2つあることに注意してください。SWTに属するGLCanvasとAWTに属するGLCanvasがあります。SWTのものは機能が完全ではなく、実際には維持されていません。SWT_AWTコンテナ内でAWTGLCanvasを使用することをお勧めします。最近のプロジェクトからのいくつかのコード:
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 の学習は簡単ではないことに注意してください。
個人的には、 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 を使用して 1 つの三角形を描画するだけの、さらに単純な例を次に示します。ビルドするには、swt.jar ( http://www.eclipse.org/swt/から) と最新の JOGL autobuild .jar および .dll ファイル ( http://jogamp.org/から)を含むプロジェクトに配置します。 . この単純な例の唯一の問題は、追加の助けがなければクロスプラットフォームにならないということです。Eclipse RCP が提供するプラットフォーム ライブラリの複数のセットを 1 つのプロジェクトにまとめてバンドルする機能が必要です。
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();
}
}