OpenGL ES学习之基础工作

来源:互联网 发布:代购淘宝描述模板 编辑:程序博客网 时间:2024/05/21 07:14

        最近课题中需要使用OpenGL ES的知识,但是之前没有接触过,所以计划从现在开始一步一步的认真学习,并对自己的学习进行一个总结和思考,以便今后的查漏补缺。由于学习使用的是OpenGL ES2.0版本,所以文中会用OpenGL ES代指OpenGL ES2.0。

        废话不多说,进入正题。开始学习一个初始化OpenGL并不停的清空屏幕的一个基础程序。

  1. 创建项目FirstOpenGLProjectActivity。
  2. 使用GLSurfaceView初始化OpenGL,GLSurfaceView实际上为自己创建了一个窗口,让底层的OpenGL surface显示出来。
  3. 创建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中并显示到屏幕中}}

  4. 创建渲染器新类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记住渲染器已经被设置过了。
  5. 使用onPause()和onResume()方法对后台渲染线程进行暂停和继续,同时释放和续用OpenGl上下文。
    @Override    protected void onPause() {        super.onPause();                if (rendererSet) {            glSurfaceView.onPause();        }    }    @Override    protected void onResume() {        super.onResume();                if (rendererSet) {            glSurfaceView.onResume();        }    }

        最后贴上效果图:


0 0