OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。
該API由Khronos集團定義推廣,Khronos是一個圖形軟硬體行業協會,該協會主要關注圖形和多媒體方面的開放標準。
在Android中搭建一個3D開發的基本架構:
一、匯入opengl es庫:
[java]
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
二、加入渲染支援:
在Android中,GLSurfaceView包含了一個專門用於渲染3D的介面Renderer,來顯示OpenGL視圖:
1、匯入支援庫:
[java]
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
2、建立一個GLRender類實現Renderer介面:
[java] view plaincopyprint?public class GLRender implements Renderer
{
}
public class GLRender implements Renderer
{
}
3、實現GLRender類中的3個抽象方法:
[java]
public void onDrawFrame(GL10 gl)
public void onSurfaceChanged(GL10 gl, int width, int height)
public void onSurfaceCreated(GL10 gl, EGLConfig config)
public void onDrawFrame(GL10 gl)
public void onSurfaceChanged(GL10 gl, int width, int height)
public void onSurfaceCreated(GL10 gl, EGLConfig config)
① onSurfaceCreated 在視窗被建立時被調用,需要做一些必要的初始化工作:
[java] view plaincopyprint?public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// 啟用陰影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景,設定清除螢幕時所用的顏色-->> (R, G, B, A) 取值: 0.0f-1.0f 。
gl.glClearColor(0, 0, 0, 0);
// 設定深度緩衝 -->> 決定哪個物體先畫。
gl.glClearDepthf(1.0f);
// 啟用深度測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度測試的類型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告訴系統對透視進行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// 啟用陰影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 黑色背景,設定清除螢幕時所用的顏色-->> (R, G, B, A) 取值: 0.0f-1.0f 。
gl.glClearColor(0, 0, 0, 0);
// 設定深度緩衝 -->> 決定哪個物體先畫。
gl.glClearDepthf(1.0f);
// 啟用深度測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度測試的類型
gl.glDepthFunc(GL10.GL_LEQUAL);
// 告訴系統對透視進行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
} ②onSurfaceChanged 當視窗大小發生改變時被調用,不管視窗的大小是否已經改變,在程式開始時至少運行一次。
在這個裡面,我們要設定OpenGL的情境大小:
[java]
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float ratio = (float) width / height;
//設定OpenGL情境的大小
gl.glViewport(0, 0, width, height);
//設定投影矩陣 -->> 增加透視.
gl.glMatrixMode(GL10.GL_PROJECTION);
//重設投影矩陣 -->> 恢複成原始狀態.
gl.glLoadIdentity();
// 設定視口的大小 -->> 前4個參數確定視窗的大小,後2個參數分別是在情境中所能繪製深度的起點和終點。
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 選擇模型觀察矩陣
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重設模型觀察矩陣
gl.glLoadIdentity();
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float ratio = (float) width / height;
//設定OpenGL情境的大小
gl.glViewport(0, 0, width, height);
//設定投影矩陣 -->> 增加透視.
gl.glMatrixMode(GL10.GL_PROJECTION);
//重設投影矩陣 -->> 恢複成原始狀態.
gl.glLoadIdentity();
// 設定視口的大小 -->> 前4個參數確定視窗的大小,後2個參數分別是在情境中所能繪製深度的起點和終點。
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 選擇模型觀察矩陣
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重設模型觀察矩陣
gl.glLoadIdentity();
}③onDrawFrame 在視窗內進行繪圖操作。 在繪圖之前,需要將螢幕清楚成前面指定的顏色,清楚深度緩衝並且重設情境,
然後就可以繪圖了:
[java]
public void onDrawFrame(GL10 gl)
{
// 清除螢幕和深度緩衝
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重設當前的模型觀察矩陣
gl.glLoadIdentity();
// 具體的繪圖操作開始 。。。
}
public void onDrawFrame(GL10 gl)
{
// 清除螢幕和深度緩衝
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重設當前的模型觀察矩陣
gl.glLoadIdentity();
// 具體的繪圖操作開始 。。。
}
三、在主程式調用我們寫好的介面:
調用GLSurfaceView類的setRenderer方法將我們自己構建的GLRender類設定為預設的Renderer,
然後,通過setContentView方法使Activity顯示一個GLSurfaceView即可。
[java]
Renderer render = new GLRender();
GLSurfaceView glView = new GLSurfaceView(this);
glView.setRenderer(render);
setContentView(glView);
Renderer render = new GLRender();
GLSurfaceView glView = new GLSurfaceView(this);
glView.setRenderer(render);
setContentView(glView);
到這裡,我們的基本架構就搭建好了。