OpenGL EGL简介

OpenGL EGL结构简介

  1. EGL,它是图形渲染API(如OpenGL ES)与本地平台窗口系统的一层接口,保证了OpenGL ES的平台无关性。EGL(The Khronos Platform Graphics Interface)提供了一种方法用于通过客户端API和本地窗口系统进行渲染,客户端API包括用于嵌入式系统的3D渲染器OpenGL ES、用于桌面系统的OpenGL(OpenGL ES的超集)、2D矢量图形渲染器OpenVG。本地窗口系统包括Windows、X。EGL 是 OpenGL 的一部分,是OpenGL接口与图形后端间的中间层,为OpenGL屏蔽了图形后端的具体类型。

  2. EGL是一套API接口(35个)

  3. OpenGL ES 是一个平台无关的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与 OpenGL是一样的,不一样的是,这部分工作是有标准的,这个标准就是EGL。在 OpenGL时代,在不同的平台上有不同的机制以关联窗口系统,在window上是wgl,在X-Window是xgl,在Apple OS 上是agl等。而EGL的工作方式和部分属于都接近于xgl, OpenGL ES 的初始化过程如下:

     Display --> Config --> Surface --> Context <-- OpenGL Command <-- APP
    
  4. OpenGL ES 本质上是一个图形渲染管线的状态机,而EGL则是用于监控这些状态以及维护 FrameBuffer 和其他渲染 surface 的外部层。OpenGL ES 图形管线的状态被存储于EGL管理的一个 Context 中,FrameBuffers和其他绘制 Surfaces 通过EGL API创建、管理和销毁,EGL同时也控制和提供了对设备显示和可能的设备渲染配置的访问。

  5. EGL 变量对象

    . Display : 代表显示器,在有些系统上可以有多个显示器,即开发设备的物理屏幕,也就会有多个Dispaly,
    每个Display在使用前都需要初始化,初始化的同时可以得到系统中使用的EGL的实现版本号。

    . Surface : 代表EGL窗口,是屏幕上的渲染区域,实际上就是一个 FrameBuffer。EGL支持三种类型的surface渲染,分别是:window、pixmap和pixel buffer。其中:

     		. window和pixmap类型的surface与本地窗口系统对应的资源息息相关;pixel buffer则是EGL资
     		源独享的,不可通过本地窗口系统进行渲染;
     		. pixmap和pixel buffer类型的surface都是(不看见屏幕off-screen)不可显示的,pixmap是保存在
     		系统内存中的位图,而pixel buffer则是保存在显存中的帧;  window是可显示的(on-screen);
     		. window绑定到了NativeWindow,pixmap绑定到了NativePixmap,pbuffer没有任何本地绑定;
     		. window是双缓冲区的,pbuffer和pixmap是单缓冲区的,window默认在back buffer渲染,
     		通过eglSwapBuffers交换到屏幕上显示(screen buffer),也就是说把EGLSurface的颜色缓冲
     		区post到Native Window,内部调用了渲染API的Flush命令。pbuffer在显存中分配,由
     		EGL_HEIGHT和EGL_WIDTH指定大小,常用作纹理数据,pixmap绑定到本地的像素缓冲区,
     		这个缓冲区以被其它API使用。
     		. pixel buffer 常用与生成纹理贴图,如果想做到的渲染到一个纹理,那么建议使用帧缓冲区对
     		象(FBO)代替PBuffer,因为帧缓冲区更高效,不过在某些FBO无法使用的情况下,PBuffer
     		仍然有用;
    
     		EGL的surface从本地window或pixmap扩展而来,还带有一些额外的buffer,包括color 
     		buffer、depth buffer、stencil buffer和alpha mask buffer,在EGL的Frame 
     		Buffer配置中包含这些额外buffer的部分或全部。
    
     	    注 : 一般来说一个屏幕上可以有多个窗口,窗口只是屏幕上的一个特定区域。
    

    . Context : 代表图形上下文,OpenGL的管线(pipeline)从应用程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、渲染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元,形成帧缓冲内的像素,在OpenGL中,Context就代表这个状态机,应用程序的主要作用就是向Context提供图源、设置状态、偶尔也从 Context 中获取一些信息。

     绑定客户端的渲染与EGL的surface时,需要用到EGL渲染context,context与surface的FrameBuffer配置必须是兼容的,客户端API的类型还会被第一次调用eglBindAPI而设定。
     
     通过 eglMakeCurrent()可能绑定了一个EGL渲染context到一个或多个EGL surface,这样context和surface就建立了关系,后面的客户端API渲染都使用了同样的context,直到以不同的参数来再次调用eglMakeCurrent。
    

    . Config : 实际上指的是 FrameBuffer 的参数,(即具体surface类型的配置),为了能够在EGL的surface上使用客户端API进行渲染,必须使用应用程序需要的渲染特性来配置合适的 EGL FrameBuffer。

  6. 同步渲染
    在一个窗口中可能不只使用了一种渲染API,如OpenGL、OpenGL ES和OpenVG,这就需要协调这些渲染API,涉及同步问题,在切换窗口系统原生渲染API之前可能不知道使用的是哪个客户端渲染API,为此可以调用eglWaitClient延迟客户端的执行,直到通过某个Khronos API的所有渲染完成,效果等同于glFinish和vgFinish,成功时返回EGL_TRUE,失败是返回EGL_FALSE,可能的错误为EGL_BAD_CURRENT_SURFACE。同样,如果需要保证原生窗口系统的渲染完成,则调用eglWaitNative,参数engine指定需要等待的渲染引擎,值为EGL_CORE_NATIVE_ENGINE,成功时返回EGL_TRUE,失败时返回EGL_FALSE,可能的错误为EGL_BAD_PARAMETER、EGL_BAD_CURRENT_SURFACE。还有一个相关函数eglWaitGL,用于执行GL操作完毕后才继续后面的Native渲染工作,同glFinish,返回EGL_FALSE时可能的错误为EGL_BAD_CURRENT_SURFACE。

你可能感兴趣的:(图像处理,OpenGL,EGL)