`
wuyangchun
  • 浏览: 4443 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

swt+jogl开发Opengl程序

阅读更多

1、swt是什么:http://www.eclipse.org/swt/
2、jogl是什么:https://jogl.dev.java.net/
3、opengl是什么: http://www.opengl.org/

一、环境搭建:
首先到jogl网站https://jogl.dev.java.net/下载最新的JOGL包jogl-1.1.0-windows-i586.zip (根据自己的环境选择相应的包),然后解压,本示例中解压到E:\wyc\学习资料\计算机\opengl\jogl\jogl-1.1.0-windows-i586。
二、配置eclipse环境:
1、到eclipse网站www.eclipse.org下载最新的eclipse版本,最好下载用于RCP(富客户端程序)开发的eclipse版本,因为该版本包含了开发SWT/JFACE图形界面的所有相关包,这里使用的是eclipse-rcp-europa-fall2-win32.zip。下载完成有解压并运行eclipse。
2、在eclipse中新建一个java工程Test,如附件中图1


3、配置Java build path: 将jogl相关的两个包gluegen-rt.jar,jogl.jar;SWT/JFACE相关的三个包添加到 build path中;并将jogl相关的DLL文件所在路径设置到Native library location中,如附件中图2:


4、编写代码:JOGL对AWT/SWING提供了很好的支持,在这里,本人仿照NEHE的JOGL示例代码编写了一些通用的基础类:
GLSEventListener 类:类似于jogl中的GLEventListener类,唯一不同的是方法中传入的参数不同,GLEventListener类中方法的参数都是GLAutoDrawable参数,而GLSEventListener是GLSCanvas,这里的GLSCanvas也是自己写的一个继承自SWT中GLCanvas的类。
package org.mywater.common;


import org.eclipse.swt.graphics.Rectangle;


public interface GLSEventListener{

public void display(GLSCanvas canvas);

public void displayChanged(GLSCanvas canvas, boolean modeChanged,
boolean deviceChanged);

public void init(GLSCanvas canvas);

public void reshape(GLSCanvas canvas, Rectangle rect);
}

由于AWT中的GLCanvas类提供了很好的OPENGL事件支持,而SWT中的GLCanvas类没有相关的方法支持,因此在这里仿照AWT中的GLCanvas类对SWT中的GLCanvas类进行了扩展。
package org.mywater.common;


import java.util.ArrayList;
import java.util.List;

import javax.media.opengl.GL;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLDrawableFactory;

import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Composite;

public class GLSCanvas extends GLCanvas {

private List eventListeners = new ArrayList();
private GLContext glContext;

public GLSCanvas(Composite parent, int style, GLData data) {
super(parent, style, data);
//添加窗口变化响应处理
this.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Rectangle rect = GLSCanvas.this.getClientArea();
reshape(rect);
}
});
//添加重绘响应处理
this.addPaintListener(new PaintListener() {

public void paintControl(PaintEvent e) {
display();
}

});
}

public void display() {
for ( int i = 0; i < eventListeners.size(); i++ ) {
( eventListeners.get( i ) ).display(this);
}
}
public void displayChanged(boolean b, boolean b1 ) {
for ( int i = 0; i < eventListeners.size(); i++ ) {
( eventListeners.get( i ) ).displayChanged( this, b, b1 );
}
}

public void init() {
for ( int i = 0; i < eventListeners.size(); i++ ) {
( eventListeners.get( i ) ).init( this );
}
}

public void reshape(Rectangle rect) {
for ( int i = 0; i < eventListeners.size(); i++ ) {
( eventListeners.get( i ) ).reshape( this, rect);
}
}
public void addGLEventListener(GLSEventListener glEventListener) {
eventListeners.add( glEventListener );
}

public void removeGLEventListener(GLSEventListener glEventListener) {
eventListeners.remove( glEventListener );
}

public GLContext getGlContext(){
if(glContext == null){
setCurrent();
glContext = GLDrawableFactory.getFactory().createExternalGLContext();
}
return glContext;
}

public GL getGL(){
return getGlContext().getGL();
}
}


为了避免每次都编写窗口相关的代码,仿照NEHE的JOGL示例代码编写了GLDisplay类来处理基本的窗口操作。
package org.mywater.common;


import java.io.PrintWriter;
import java.io.StringWriter;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.opengl.GLData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class GLDisplay {
private static final int DEFAULT_WIDTH = 640;
private static final int DEFAULT_HEIGHT = 480;

private GLSCanvas glSCanvas;
private Shell shell;

private ExceptionHandler exceptionHandler = new ExceptionHandler();

public static GLDisplay createGLDisplay( String title ) {
return new GLDisplay( title, DEFAULT_WIDTH, DEFAULT_HEIGHT, false );
}

private GLDisplay( String title, int width, int height, boolean fullscreen ) {
Display display = Display.getDefault();
shell = new Shell(display);
GLData glData = new GLData();
glData.doubleBuffer = true;
glSCanvas = new GLSCanvas(shell, SWT.NO_BACKGROUND, glData);

shell.setText(title);
shell.setLayout(new FillLayout());

}

public void start() {
try {
glSCanvas.init();
shell.open();

Display display = shell.getDisplay();
while(!shell.isDisposed()){
while(!display.readAndDispatch()){
display.sleep();
}
}

display.dispose();
} catch ( Exception e ) {
exceptionHandler.handleException( e );
}
}


public void addGLEventListener( GLSEventListener glEventListener ) {
glSCanvas.addGLEventListener(glEventListener);
}

public void removeGLEventListener( GLSEventListener glEventListener ) {
glSCanvas.removeGLEventListener( glEventListener );
}

public void addKeyListener( KeyListener l ) {
glSCanvas.addKeyListener( l );
}

public void addMouseListener( MouseListener l ) {
glSCanvas.addMouseListener( l );
}

public void removeKeyListener( KeyListener l ) {
glSCanvas.removeKeyListener( l );
}

public void removeMouseListener( MouseListener l ) {
glSCanvas.removeMouseListener( l );
}

public String getTitle() {
return shell.getText();
}

public void setTitle( String title ) {
shell.setText( title );
}

private class ExceptionHandler{
public void handleException( final Exception e ) {
Display.getDefault().syncExec( new Runnable() {
public void run() {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter( stringWriter );
e.printStackTrace( printWriter );
MessageDialog.openInformation( shell, stringWriter.toString(), "Exception occurred");
}
} );
}
}
}

最后,编写OPENL相关代码,运行该类,可得到一个黑色的背景上面画着一个白色矩形的窗口。
package org.mywater.lessons.lesson001;

import javax.media.opengl.GL;
import javax.media.opengl.GLContext;

import org.eclipse.swt.graphics.Rectangle;
import org.mywater.common.GLDisplay;
import org.mywater.common.GLSCanvas;
import org.mywater.common.GLSEventListener;

public class Lesson001 implements GLSEventListener {

public static void main(String[] args){
GLDisplay glDisplay = GLDisplay.createGLDisplay("test");
glDisplay.addGLEventListener(new Lesson001());
glDisplay.start();
}

public void display(GLSCanvas canvas) {

canvas.setCurrent();
GLContext context = canvas.getGlContext();
context.makeCurrent();
GL gl = canvas.getGL();

gl.glClear (GL.GL_COLOR_BUFFER_BIT);
gl.glBegin(GL.GL_POLYGON);
gl.glVertex3f (0.25f, 0.25f, 0.0f);
gl.glVertex3f (0.75f, 0.25f, 0.0f);
gl.glVertex3f (0.75f, 0.75f, 0.0f);
gl.glVertex3f (0.25f, 0.75f, 0.0f);
gl.glEnd();
gl.glFlush();
canvas.swapBuffers();
context.release();

}

public void displayChanged(GLSCanvas canvas, boolean modeChanged,
boolean deviceChanged) {
// TODO Auto-generated method stub

}

public void init(GLSCanvas canvas) {
canvas.setCurrent();
GLContext context = canvas.getGlContext();
context.makeCurrent();
GL gl = canvas.getGL();
gl.glLoadIdentity();
gl.glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
gl.glClear (GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f (1.0f, 1.0f, 1.0f);
context.release();
}

public void reshape(GLSCanvas canvas, Rectangle rect) {
canvas.setCurrent();
GLContext context = canvas.getGlContext();
context.makeCurrent();
GL gl = context.getGL ();
gl.glViewport(0, 0, rect.width, rect.height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
context.release();
}
}

具体的代码都比较简单,所以细节没有做详细的解释,如果哪位仁兄看到该文章并且有疑问,欢迎邮件联系讨论wuyangchun1984@gmail.com
声名:本人OPENGL新手,所以考虑的东西比较简单,相应的代码会在本人学习OPENGL的过程中不断改进,欢迎高手指点。

 

  • 描述: 图2
  • 大小: 110.3 KB
  • 描述: 图1
  • 大小: 72.2 KB
10
6
分享到:
评论

相关推荐

    jogl.rar_JOGL texture_jogl_opengl_opengl java_opengl texture Jav

    1. **JOGL简介**:JOGL(Java Bindings for OpenGL)是OpenGL的官方Java绑定,允许Java应用程序直接访问原生的OpenGL库。它通过JNI(Java Native Interface)提供服务,使得开发者可以在Java环境中编写高性能的图形...

    win64+java+OpenGL库文件(JOGL)

    win64系统java语言开发OpenGL三维程序所用库文件jogl,包括dll文件,jar库,zip文件,环境配置方法,经过上机实践,没有任何问题,放心下载使用。

    Java程序中的OpenGL(JOGL学习教程)

    Java 程序中的 OpenGL(JOGL 学习教程) Java 程序中的 OpenGL 是使用 Java 语言开发图形应用程序的重要组件。OpenGL 是一个应用最广泛的图形库,支持所有的流行的平台,且能确保项目能正确部署。JOGL 实现了 Java ...

    JAVA JOGL OPENGL 编程基础实例

    Java JOGL (Java Bindings for OpenGL) 是一个用于在Java平台上使用OpenGL图形库的接口,它使得Java开发者能够利用OpenGL的强大功能进行3D图形编程。OpenGL是一个广泛应用的跨语言、跨平台的图形API,用于渲染2D、3D...

    jogl-2.1开发相关文件

    总结起来,"jogl-2.1开发相关文件"是一套完整的Jogl开发资源,包括必要的库文件、源码和文档,旨在帮助Java开发者构建和使用OpenGL应用程序。无论你是初学者还是经验丰富的程序员,这个资源包都将极大地促进你在图形...

    opengl基于java语言的jar包(jogl)

    使用这些库文件,开发者可以创建一个Java项目,导入JOGL库,然后编写OpenGL程序。例如,可以创建一个窗口,设置视口,定义顶点,绘制几何形状,并添加颜色和光照效果。同时,通过FastJSON库,可以方便地处理程序中的...

    Java OpenGL(JOGL)学习笔记,含代码

    Java OpenGL(JOGL)学习笔记 在学习 JOGL 时,我们需要了解图形显示器是如何工作的。...JOGL 是 Java 语言和 OpenGL 的绑定,提供了硬件支持和图形库的功能,使我们能够使用 Java 语言来开发复杂的图形应用程序。

    64位jogl包

    JOGL,全称为Java Bindings for OpenGL,是Java平台上的一个开源项目,它允许Java开发者直接使用OpenGL标准来创建高性能的图形应用程序。64位版本的JOGL是为了在64位系统上获得更好的性能和内存管理而提供的。 描述...

    nehe的jogl与其他jogl教程20121102

    JOGL是Java平台上的一个开源库,它允许开发者使用Java语言直接访问OpenGL的原生功能,从而创建高性能的3D图形应用程序。 【描述】提到的“想做自己的3D游戏”,暗示了这个教程可能涵盖了如何使用JOGL来构建游戏的...

    jogl简单入门例子,15个例子,JOGL1.0,2.0的jar包

    通过这15个例子,你将逐步熟悉JOGL的API,理解OpenGL的基本概念,并能构建自己的3D应用程序。记得每个例子都要深入研究,理解其背后的原理,这样才能更好地掌握JOGL和OpenGL编程。在实践中遇到问题,查阅官方文档和...

    java openGL 开发库

    在Java环境中开发OpenGL应用,通常会借助特定的开发库,其中一个常用的库就是JOGL(Java Bindings for OpenGL)。JOGL使得Java程序员能够直接调用原生的OpenGL函数,从而在Java应用程序中实现高性能的图形渲染。 **...

    JOGL tutorial, 教程

    ### JOGL教程详解 #### 一、JOGL简介与特点 JOGL(Java Binding for OpenGL)是...综上所述,JOGL为Java开发者提供了一个全面而强大的OpenGL解决方案,无论是对于游戏开发还是专业图形应用程序的开发都具有重要意义。

    java_opengl_jogl.zip

    java opengl jogl 含简单代码

    jogl简介,jogl入门例子

    Jogl作为一个Java绑定,为Java应用程序提供了与原生OpenGL接口的无缝对接,让开发者无需离开熟悉的Java环境就能实现复杂的图形渲染。 **Jogl入门例子** 在开始使用Jogl进行开发之前,你需要确保已经安装了Java ...

    Using-OpenGL-in-Java-with-JOGL.rar_in_jogl

    Java OpenGL绑定(JOGL,Java Bindings for OpenGL)则允许Java开发者利用OpenGL的功能,为Java应用程序提供高性能的图形渲染能力。这篇教程"Using OpenGL in Java with JOGL"将深入探讨如何在Java环境中有效地使用...

    nehe-source JOGL学习代码

    "OpenGL"是一个用于渲染2D和3D图形的跨语言、跨平台的应用程序编程接口(API),被广泛应用于游戏开发、科学可视化、工程建模等领域。 【压缩包子文件的文件名称列表】"nehe-source"可能包含的是NeHe教程的各个章节或...

    vc++、dev和java开发OpenGL环境配置

    在Java环境中配置OpenGL开发,可以使用Java绑定库如JOGL(Java Bindings for OpenGL),它允许Java开发者直接调用OpenGL函数。配置过程通常涉及下载JOGL库,将其添加到项目的类路径中,然后使用Java代码创建OpenGL上...

    netbeans opengl开发包

    标题中的“netbeans opengl开发包”指的是一个用于NetBeans集成开发环境的扩展包,它专为使用OpenGL在Java平台上开发3D图形应用程序提供支持。OpenGL是一种强大的图形库,广泛应用于游戏开发、科学可视化和工程设计...

Global site tag (gtag.js) - Google Analytics