音视频学习三: EGL讲解

  • EGL

Opengl与窗口系统对应的设配层

EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下: 
1. 和本地窗口系统(native windowing system)通讯; 
2. 查询可用的配置; 
3. 创建OpenGL ES可用的“绘图表面”(drawing surface); 
4. 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间; 
5. 管理“渲染资源”,比如纹理映射(rendering map)

①EGLDisplay与原生窗口的链接:

EGL可运行于GNU/Linux的X Window System,Microsoft Windows和MacOS X的Quartz。 
EGL把这些平台的显示系统抽象为一个独立的类型:EGLDisplay。

EGLDisplay eglGetDisplay(EGLNativeDisplayType id);  
EGLBoolean eglInitialize(EGLDisplay display, EGLint* majorVersion, EGLint* minorVersion);  
EGLint eglGetError();  

②EGLConfig 初始化过后,要选择一个合适的“绘图表面”。

EGLBoolean eglChooseConfig(EGLDisplay display,  
                           const EGLint* attribs,    // 你想要的属性事先定义到这个数组里  
                           EGLConfig* configs,       // 图形系统将返回若干满足条件的配置到该数组  
                           EGLint maxConfigs,        // 上面数组的容量  
                           EGLint* numConfigs);      // 图形系统返回的可用的配置个数  

③Surface创建和Surface配置(窗口和屏幕上的渲染区域)

EGLSurface eglCreateWindowSurface(EGLDisplay display,  
                                  EGLConfig config,  
                                  EGLNativeWindowType window, // 在Windows上就是HWND类型  
                                  const EGLint* attribs);     // 此属性表非彼属性表  

④EGLContext 创建渲染环境

-渲染环境指OpenGL ES的所有项目运行需要的数据结构,如顶点、片元着色器,顶点数据矩阵

EGLContext eglCreateContext(EGLDisplay display,  
                            EGLConfig config,  
                            EGLContext context,    // EGL_NO_CONTEXT表示不向其它的context共享资源  
                            const EGLint * attribs)// 我们暂时只用EGL_CONTEXT_CLIENT_VERSION  

eglMakeCurrent(display, window, window, context) // 两个window表示读写都在一个窗口

代码演示:

virtual bool Init(void *win) {
        Close();
        ANativeWindow *nativeWindow = (ANativeWindow *) win;
        //初始化EGL
        //①获取EGLDisplay对象 显示设备
        mux.lock();
        this->eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
        if (eglDisplay == EGL_NO_DISPLAY) {
            XLOGE("eglGetDisplay failed!");
            mux.unlock();
            return false;
        }
        //②初始化disPlay
        if (EGL_TRUE != eglInitialize(eglDisplay, 0, 0)) {
            XLOGE("eglInitialize failed!");
            mux.unlock();
            return false;
        }
        //③获取配置并创建surface
        EGLint configSpec[] = {
                EGL_RED_SIZE, 8,
                EGL_GREEN_SIZE, 8,
                EGL_BLUE_SIZE, 8,
                EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
                EGL_NONE
        };
        EGLConfig config = 0;
        EGLint numConfigs = 0;
        if (EGL_TRUE != eglChooseConfig(eglDisplay, configSpec, &config, 1, &numConfigs)) {
            XLOGE("eglChooseConfig failed!");
            mux.unlock();
            return false;
        }
        //创建surface
        eglSurface = eglCreateWindowSurface(eglDisplay, config, nativeWindow, NULL);
        if (eglSurface == EGL_NO_SURFACE) {
            XLOGE("eglCreateWindowSurface failed!");
            mux.unlock();
            return false;
        }
        //④创建并打开上下文
        const EGLint ctxAttr[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
        eglContext = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, ctxAttr);
        if (eglContext == EGL_NO_CONTEXT) {
            XLOGE("eglCreateContext failed!");
            mux.unlock();
            return false;
        }
        //上下文切换
        if (EGL_TRUE != eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
            XLOGE("eglMakeCurrent faliled!");
            mux.unlock();
            return false;
        }
        XLOGE("ANativeWindow init success!");
        mux.unlock();
        return true;
    }
};

 

 

猜你喜欢

转载自blog.csdn.net/qq_33635618/article/details/91523975