最近课题中需要使用OpenGL ES的知识,但是之前没有接触过,所以计划从现在开始一步一步的认真学习,并对自己的学习进行一个总结和思考,以便今后的查漏补缺。由于学习使用的是OpenGL ES2.0版本,所以文中会用OpenGL ES代指OpenGL ES2.0。
废话不多说,进入正题。开始学习一个初始化OpenGL并不停的清空屏幕的一个基础程序。
- 创建项目FirstOpenGLProjectActivity。
- 使用GLSurfaceView初始化OpenGL,GLSurfaceView实际上为自己创建了一个窗口,让底层的OpenGL surface显示出来。
- 创建GLSurfaceView实例,并通过Setrenderer记住GLSurfaceView是否处于有效状态,同时移除项目创建时候自动对setContentView()的调用,将GLSurfaceView实例(glSurfaceView)加入进行初始化。
public class FirstOpenGLProjectActivity extends Activity { private GLSurfaceView glSurfaceView; private boolean rendererSet = false;//记住GLSurfaceView是否处于有效状态 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new GLSurfaceView(this);//创建GLSurfaceView实例 setContentView(glSurfaceView);//将GLSurfaceView加到activity中并显示到屏幕中}}
- 创建渲染器新类FirstOpenGLProjectRenderer,并实现Renderer接口。该渲染器接口主要定义有三个方法,即onSurfaceCreated(GL10 glUnused, EGLConfig config)方法:当Surface被创建的时候,GLSurfaceView会调用这个方法;onSurfaceChanged(GL10 glUnused, int width, int height)方法:在Surface被创建后,每次Surface尺寸变化时(横竖屏切换时),此方法都会被GLSurfaceView调用;onDrawFrame(GL10 glUnused)方法:当绘制一帧时,此方法会被GLSurfaceView调用。并为这三个方法对应设置清空屏幕用的颜色、视口尺寸和清空屏幕命令。
@Override public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { // 将背景清除颜色设置为红色. 前三个参数分别对应红色、绿色和蓝色,最后的参数对应一个特殊的分量,称为阿尔法,它经常用来表示半透明度或者透明度。 glClearColor(1.0f, 0.0f, 0.0f, 0.0f); } @Override public void onSurfaceChanged(GL10 glUnused, int width, int height) { // 设置OpenGL的视口(viewport)尺寸 铺满整个surface。 glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 glUnused) { // Clear the rendering surface. glClear(GL_COLOR_BUFFER_BIT); }
需要在FirstOpenGLProjectActivity类中glSurfaceView = new GLSurfaceView(this);之后调用sentRenderer()方法传入自定义的FirstOpenGLProjectRenderer类的一个新实例,并通过设置rendererSet为true记住渲染器已经被设置过了。
使用onPause()和onResume()方法对后台渲染线程进行暂停和继续,同时释放和续用OpenGl上下文。
@Override protected void onPause() { super.onPause(); if (rendererSet) { glSurfaceView.onPause(); } } @Override protected void onResume() { super.onResume(); if (rendererSet) { glSurfaceView.onResume(); } }
最后贴上效果图: