使用OpenGL时,大多都是使用C/C++来编程。我之前一直是使用Visual Studio 2013写OpenGL程序,OpenGL配置很方便,使用CMAKE生成相关库的解决方案,再VS编译之,.dll动态库就自己生成了,而且完美适配你自己的电脑硬件,一般不会出错。最后,把.h和.dll文件拷到相应的文件夹下面即可。当然,这不是本篇文章的重点,本文主要是介绍OpenGL使用Java平台来编程时的配置问题。
JOGL就是绑定到Java的OpenGL API。既然要用到JOGL,当然就涉及到一个配置问题。和大家一样,我在国内网站百度,发现相关的配置教程写得模模糊糊的,而且大多内容上一致,根本没一点帮助。我干脆就自己去谷歌了下,最后配置好了,下面把方法分享给大家。
JOGL有 两种配置形式:一种使用JAR包(jar文件夹下),另外一种使用.dll动态库(lib文件夹下),国内很多配置教程把这两个方法混在了一起。我感觉jar包的方式更方便,所以本文直接使用JAR包来配置。贴出谷歌的原文截图:
user library的方法:
第一步:前往http://jogamp.org下载JOGL。
如上图,点击上面的zip,进入到下载页面http://jogamp.org/deployment/jogamp-current/archive,然后下载jogamp-all-platforms.7z这个文件就可以了:
第二步:解压文件jogamp-all-platforms.7z,再将解压好的文件夹拷贝到你的Eclipse的工作区间文件夹(WorkPlace)下面,此时打开Eclipse,直接点Windows → preferences → Java → Build Path → User Libraries:
点击New…按钮,输入JOGL(库名称,方便以后辨识我用了JOGL):
点击Add External JARs…按钮,进到刚才放到工作区间(WorkPlace)下面的jogamp-all-platforms文件夹下面的jar文件夹下面,点选”gluegen-rt.jar” “jogl-all.jar”两个文件即可:
然后展开JOGL,分别点击Edit…按钮编辑Javadoc location项,输入http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/,然后保存。
同样还是展开JOGL,分别点击Edit…按钮编辑Source attachment项,点选Extenal location项,文件还是在工作区间的jogamp-all-platforms文件夹下面,分别是gluegen-java-src.zip、jogl-java-src.zip:
上面步骤全部完成之后要记得点击OK保存。
第三步:新建一个Java项目来验证JOGL是否配置好,引入刚才的那个用户库的方法,右击项目名 → Build Path → Add Library… → User Library → Next > → 勾选刚才创建的那个JOGL用户库,点击OK:
直接为单个工程导入jar包的方法:
第一步:项目文件上右键New → Folder → 输入文件夹的名称(一般命名为lib,用来存放第三方jar包):
第二步:解压文件jogamp-all-platforms.7,将其中的四个jar包拷贝至刚才的lib文件夹下面,拷贝好之后选中这四个jar包,直接点右键 → Build Path → Add to Build Path:
第三步:确认下此时项目文件夹下面是否有如下图的Reference Libraries,如果有,说明配置成功:
上面配置好了,就可以开始测试了。附上测试代码OpenGL.java:
package lighting;
import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
public class LightingPolygon implements GLEventListener {
private float angle = 0.0f;
@Override
public void display(GLAutoDrawable drawable) {
// 绘制代码
final GL2 gl = drawable.getGL().getGL2();
gl.glColor3f(0.2f, 0.9f, 0.1f);
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glRotated(angle, 0.0f, 1.0f, 0.0f);
// 光照
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
gl.glEnable(GL2.GL_NORMALIZE);//为了在使用缩放的情况下仍然保证法向量为单位长度
// 设置光源
float[] ambientLight = { 1.0f, 1.0f, 1.0f, 0.0f };//环境光一般这么设置
float[] diffuseLight = { 1.0f, 1.0f, 1.0f, 0.0f};//漫反射光一般设置成和环境光一致
float[] specularLight={0.1f, 0.2f, 0.6f, 0.0f};
float[] positionLight = { -0.9f, 0.9f, 0.9f, 1.0f };
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_SPECULAR, specularLight,0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, positionLight, 0);
// 设置光照模型
float[] ambientModel = { 0.4f, 0.4f, 0.4f, 1.0f };
float[] viewLmodel = { 0.0f, 0.0f, 0.0f, 1.0f };
gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, ambientModel, 0);
gl.glLightModelfv(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, viewLmodel, 0);
//设置物体材质
// float[] ambientMat={1.0f,1.0f,1.0f,0.0f};
// float[] diffuseMat={1.0f,1.0f,1.0f,0.0f};
// float[] specularMat={1.0f,1.0f,1.0f,1.0f};
// float[] emissionMat={0.3f,0.2f,0.2f,0.0f};
// float shininess=100.0f;//镜面反射系数
// gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_AMBIENT,ambientMat,0);
// gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_DIFFUSE,diffuseMat,0);
// gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_SPECULAR,specularMat,0);
// gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_EMISSION,emissionMat,0);
// gl.glMaterialf(GL2.GL_FRONT,GL2.GL_SHININESS,shininess);
gl.glBegin(GL2.GL_POLYGON);
gl.glNormal3f(0.0f,0.0f, 1.0f);//指定法向量
gl.glVertex3f(0f, 0.5f, 0f);
gl.glVertex3f(-0.5f, 0.2f, 0f);
gl.glVertex3f(-0.5f, -0.2f, 0f);
gl.glVertex3f(0f, -0.5f, 0f);
gl.glVertex3f(0f, 0.5f, 0f);
gl.glVertex3f(0.5f, 0.2f, 0f);
gl.glVertex3f(0.5f, -0.2f, 0f);
gl.glVertex3f(0f, -0.5f, 0f);
gl.glEnd();
gl.glFlush();
angle += 3.0f;
}
@Override
public void dispose(GLAutoDrawable arg0) {
//
}
@Override
public void init(GLAutoDrawable drawable) {
// 设置背景颜色
GL2 gl = drawable.getGL().getGL2();
gl.glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
}
@Override
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 获取GL2的所有特性
final GLProfile proifile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(proifile);
// 画布
final GLCanvas glCanvas = new GLCanvas(capabilities);
LightingPolygon lightingPolygon = new LightingPolygon();
glCanvas.addGLEventListener(lightingPolygon);
glCanvas.setSize(600, 600);
// 创建JFrame
final JFrame frame = new JFrame("带光照效果的旋转多边形");
frame.getContentPane().add(glCanvas);
frame.setSize(frame.getContentPane().getPreferredSize());
frame.setVisible(true);
// 设置动画
final FPSAnimator animator = new FPSAnimator(glCanvas, 300, true);
animator.start();
}
}
运行出来的效果图:
验证通过时,窗口为淡蓝色背景,中间有一个旋转的六边形。