Android中使用GLSurfaceView初始化opengl es, GLSurfaceView会处理opengl es初始化过程中比较基本的操作,比如:
- 配置egl,egl提供了opengl es和系统原生窗口之间的一个结合层次,与系统的原生窗口通信,将opengl es的绘制最终展现给用户。
- 在后台线程中渲染,此处要注意,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);
}
}