android的GLSurfaceView

Android中使用GLSurfaceView初始化opengl es, GLSurfaceView會處理opengl es初始化過程當中比較基本的操做,好比:ide

  1. 配置egl,egl提供了opengl es和系統原生窗口之間的一個結合層次,與系統的原生窗口通訊,將opengl es的繪製最終展示給用戶。
  2. 在後臺線程中渲染,此處要注意,opengl es的渲染不是在UI主線程中,而是在後臺另外啓動了一個線程。兩個線程之間的通訊能夠用以下方法:在主線程中調用GLSurfaceView的queueEvent()函數傳遞一個runnable給後臺渲染線程;後臺渲染線程能夠調用Activity的runOnUIThread()來傳遞事件給主線程。
  • 咱們須要爲GLSurfaceView提供Renderer,Renderer中有三個回調接口,onSurfaceCreated, onSurfaceChanged, onDrawFragme,這些接口須要開發人員實現。前兩個容易理解,分部是一個繪製的窗口剛剛被建立的時候,和這個窗口的大小發生改變的時候。咱們須要注意的是onDrawFrame,咱們須要在這個函數中繪製一些東西,後臺的渲染線程會的調用這個函數。
  • 在默認狀況下GLSurfaceView的後臺渲染線程中以顯示設備的刷新頻率不斷的渲染,固然,也能夠配置爲按請求渲染,只須要用GLSurfaceView.RENDERMODE_WHEN_DIRTY做爲GLSurfaceView.setRenderMode()的參數,而後在你須要界面渲染的時候,調用GLSurfaceView.requestRender()。
  • 在這裏貼出簡單的源碼,但願能幫助到有須要的各位。
public class MainActivity extends Activity {
	private GLSurfaceView view;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		view = new GLSurfaceView(this);
		FirstOpenglRender render = new FirstOpenglRender();
		
		//設置爲opengl es 2.0的context
		view.setEGLContextClientVersion(2);   
		
		//RGBA位數都爲8,深度緩衝區的位數是16,模板緩衝區的位數是0
    	view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
    	
		view.setRenderer(render);
		setContentView(view);
	}

	@Override
	protected void onPause() {
		super.onPause();
		view.onPause();
	}

	@Override
	protected void onResume() {		
		super.onResume();
		view.onResume();
	}

  }

GLSurfaceView提供了針對Acitvity生命週期的函數調用,好比Activity出於onPause狀態的時候,咱們是否是該調用GLSurfaceView的onPause函數,中止後臺渲染線程的工做呢?函數

public class FirstOpenglRender implements Renderer {

	@Override
	public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
		//用紅色清空屏幕
		GLES20.glClearColor(1F, 0F, 0F, 0F);
	}  
		
	@Override
	public void onSurfaceChanged(GL10 arg0, int width, int height) {
		//設置視口
		GLES20.glViewport(0, 0, width, height);
	}

	@Override
	public void onDrawFrame(GL10 arg0) {
		//清空屏幕,擦除屏幕上全部的顏色,用GLES20.glClearColor(1F, 0F, 0F, 0F)中定義的顏色填充屏幕
		GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);			
	}

}
相關文章
相關標籤/搜索