OpenGL ES学习教程 --- EGL

OpenGL ES学习教程 — EGL

简介之什么是EGL

OpenGL是跨平台开源的库,功能实现由各个产商完成,为了实现OpenGL对各个产商的功能调用,开发了EGL这一中间件连接以上二者;我们通常在使用Android的GLSurface时并没有配置EGL中间环境,因为GLSurface帮我们实现了,如果我们使用Surface的话则需要自己去配置EGL;说得实际一点,在编写代码时,EGL主要为我们提供以下几个功能:

  • 创建本地相关窗口缓存(Frame Buffer),可以直接显示到Surface上
  • 创建渲染上下文,让我们去渲染顶点、着色器等

EGL10和EGL14之区别

EGL10是2003年的,位于javax.microedition.khronos.egl路径下
EGL14是2014年的,Android api17引入的,在android.opengl下
注意: EGL10不支持GLES2.x版本下的一些字段,可能需要手动编写,但是他们底层都是调用的native系统库

以下学习内容由EGL14版本讲解

EGL名词解释

EGLDisplay:显示屏幕的类,表示一个可以显示的屏幕
EGLConfig:FrameBuffer的配置属性
EGLSurface:实质就是一个FrameBuffer,可以直接用于在surface上显示,这个有点像FBO
EGLContext:渲染上下文,用于绑定上面3个属性,将其关联起来

EGL开发步骤

  • 创建显示屏幕类EGLDisplay
  • 配置FrameBuffer的配置类EGLConfig
  • 创建FrameBuffer的EGLSurface
  • 创建上下文,并于surface绑定

创建EGLDisplay

获取默认的显示屏幕

EGLDisplay eglDisplay = EGL14.EGL_NO_DISPLAY;
eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);

配置EGLConfig

自己预先配置好FrameBuffer的属性,再从屏幕只能够选择一个最优的配置

		//配置frameBuffer格式和能力
        int[] configAttri = {
    
    
                EGL14.EGL_RED_SIZE, 8,
                EGL14.EGL_GREEN_SIZE, 8,
                EGL14.EGL_BLUE_SIZE, 8,
                EGL14.EGL_ALPHA_SIZE, 8, // rgba存储大小
                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,        					//渲染类型
                EGL14.EGL_NONE   //必须NONE结尾
        };
		int[] configNums = new int[1];
        EGLConfig[] configs = new EGLConfig[1];
        if(!EGL14.eglChooseConfig(eglDisplay, configAttri, 0, configs, 0, configs.length, configNums, 0)){
    
    
            throw new RuntimeException("egl config error");
        }
        eglConfig = configs[0];

创建EGLSurface

创建EGLSurface有三种方法,

方法名 解释 特点
eglCreateWindowSurface 创建一个离屏的渲染surface 需要绑定本地window surface,内部back buffer双缓冲实现,eglswapbuffer切换buffer在屏幕上显示
eglCreatePixmapSurface 创建一个离屏的渲染surface 单缓冲形式,内部是以位图形式存储,window暂不支持将其在屏幕上显示
eglCreatePbufferSurface 创建一个离屏的渲染surface 双缓冲形式,但是不支持调用eglswapbuffer关联window形式

故: 后两者无法在屏幕上显示

总结

经过以上的EGL初始化配置,我们就可以按照之前的代码进行OpenGL的顶点、纹理创建、配置、绘图等,而不需要去使用GLSurfaceView,也不需要去继承GLSurfaceView.Render,因为EGL帮我们做了

最后,可以参考我的学习demo

猜你喜欢

转载自blog.csdn.net/jackzhouyu/article/details/96280532