目錄
一、效果
二、GLSurfaceView
GLSurfaceView從Android 1.5(API level 3)開始加入,繼承自SurfaceView,實現了SurfaceHolder.Callback2接口,擁有SurfaceView的全部特性,也有view所有的功能和屬性,特別是處理事件的能力,它主要是在SurfaceView的基礎上它加入了EGL的管理,並自帶了一個GLThread繪製線程(EGLContext創建GL環境所在線程即爲GL線程),繪製的工作直接通過OpenGL在繪製線程進行,不會阻塞主線程,繪製的結果輸出到SurfaceView所提供的Surface上,這使得GLSurfaceView也擁有了OpenGlES所提供的圖形處理能力,通過它定義的Render接口,使更改具體的Render的行爲非常靈活性,只需要將實現了渲染函數的Renderer的實現類設置給GLSurfaceView即可。
三、渲染
創建一個GLSurfaceView的子類,添加到父View中,之後的操作主要在Renderer類中。
private void init(Context context) {
this.setEGLContextClientVersion(2); // 設置使用OPENGL ES3.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setPreserveEGLContextOnPause(true);//如果沒有這一句,那onPause之後再onResume屏幕將會是黑屏滴
}
setRenderer(mRenderer);//設置渲染器
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);//請求的時候纔去渲染一次;RENDERMODE_CONTINUOUSLY爲持續渲染
}
/**
* 渲染器
*/
private Renderer mRenderer = new Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(1.0f, 1.0f, 0.0f, 1.0f);//設置背景色,黃色
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// GLES20.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
//清楚深度緩存和顏色緩存
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
}
};
如上,無需過多操作,就能設置整個GLView的背景顏色,其中glClearColor爲設置清屏時的顏色。而glClear中的GL_COLOR_BUFFER_BIT掩碼則表示用glClearColor指定的顏色來清屏。
四、注意
1.在Activity的生命週期中的onResume和onPause時分別調用GLSurfaceView的onResume和onPause,以便GLSV釋放資源。
2.glClearColor中每個元素的取值範圍爲[0f,1f]。
五、相關參考
六、代碼地址