使用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();
}
}
運行出來的效果圖:
驗證通過時,窗口爲淡藍色背景,中間有一個旋轉的六邊形。