Android OpenGL ES 读书笔记(1)

作者: maimingliang | 来源:发表于2017-08-20 20:10 被阅读348次

    初始化OpenGL

    我们通过搭建一个简单OpenGL的项目,然后一步步细化,了解其中的奥秘。

    书籍地址PDF:OpenGL ES2.0 应用开发实践指南Android卷

    源码地址:https://github.com/maimingliang/OpenGLDemo

    初始化GLSurfaceView

    GLSurfaceView是一个视图,继承至SurfaceView,通过内嵌的“surface”的特定内存区域完成对OpenGL的渲染。

    GLSurfaceView的特性:

    1. 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
    2. 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
    3. 用户自定义渲染器(render)。
    4. 让渲染器在独立的线程里运作,和UI线程分离。
    5. 支持按需渲染(on-demand)和连续渲染(continuous)。
    6. 一些可选工具,如调试。

    创建GLSurfaceView实例:

     mGLSurfaceView = new GLSurfaceView(this);
     initGl(); 
     setContentView(mGLSurfaceView);
    
     private void initGl() { 
     
    //判断是否支持OpenGL 2.0
     if (!Utils.isSuppostEs2(this)) {
     Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
     return; 
     }  
     mGLSurfaceView.setEGLContextClientVersion(2);
     
     } 
    

    判断是否支持OpenGL 2.0

    /**
    *判断是否支持OpenGL 2.0
    */
     public static boolean isSuppostEs2(Context context) {
     
     ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
     
     ConfigurationInfo deviceConfigurationInfo = activityManager.getDeviceConfigurationInfo();
     
     int version = deviceConfigurationInfo.reqGlEsVersion;
     
     if(version >= 0x20000){
     return true; 
     } 
     
     return false; 
     } 
    

    处理一下生命周期事件

     @Override 
     protected void onResume() { 
     super.onResume(); 
     if (rendererSet) {
     mGLSurfaceView.onResume();
     } 
     } 
     
     @Override 
     protected void onPause() { 
     super.onPause(); 
     if (rendererSet) {
     mGLSurfaceView.onPause();
     } 
     } 
    
    

    创建Renderer类

    Renderer渲染器,GLSurfaceView会在一个单独的线程调用渲染器的方法,默认的情况下,GLSurfaceView会以显示设备刷新频率不断的渲染。

    Renderer是一个接口,定义了三个方法:

    onSurfaceCreated:当Surface被创建的时候,GLSurfaceView会调用这个方法 ,这发生在应用程序第一次运行的时候,并且,当设备唤醒或者用户从其他Activity切换回来时,这个方法也可能被调用。

    onSurfaceChanged:在surface创建以后,每次surface尺寸的变化,这个方法都会别调用。比如横竖屏切换。

    onDrawFrame:当绘制一帧时,这个方法就会别调用,在这个方法中,我们一定要绘制点东西,即使只是清空屏幕;因为这个方法调用后,渲染缓冲区就会交换显示到屏幕上,如果什么都没有绘制,屏幕可能出现闪烁的情况。

    
    public class MyRender implements GLSurfaceView.Renderer {
     
     
     private Context mContext;
     
     public MyRender(Context context) {
     mContext = context;
     
     } 
     
     
     @Override 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //设置清空屏幕用的颜色,分别对应红色、绿色和蓝色,最后一个为透明度。
     GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
     } 
     
     @Override 
     public void onSurfaceChanged(GL10 gl, int width, int height) {
    //设置了视口尺寸,告诉 OpenGL 可以用来渲染的 surface 的大小。
     GLES20.glViewport(0, 0, width, height);
     } 
     
     @Override 
     public void onDrawFrame(GL10 gl) {
     //会擦除屏幕上的所有颜色,并用 glClearColor 中的颜色填充整个屏幕。
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
     } 
    } 
    
    

    Renderer与GLSurfaceView关联

     private void initGl() { 
    
     if (!Utils.isSuppostEs2(this)) {
     Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
     return; 
     } 
    
     mGLSurfaceView.setEGLContextClientVersion(2);
    //设置GLSurfaceView关联的Renderer
     mGLSurfaceView.setRenderer(new AirHockeyRenderer(this));
     rendererSet = true;
     
     
     } 
    

    将程序运行起来了,你将看到一个完全红色的屏幕。

    END

    相关文章

      网友评论

        本文标题:Android OpenGL ES 读书笔记(1)

        本文链接:https://www.haomeiwen.com/subject/jwaxdxtx.html