EGL workflow

来源:互联网 发布:linux ping不通网关 编辑:程序博客网 时间:2024/06/03 13:55

https://www.khronos.org/registry/EGL/sdk/docs/man/html/


基本概念

EGL是OpenGL ES与本地Window系统之间的桥梁。EGL创建渲染上下文(Rendering Context)和Surface,Rendering Context是OpenGL ES的状态机,Surface是OpenGL ES绘图的“画布”

Display

Display是OpenGL ES应用运行平台的物理显示器的抽象

Rendering Context

OpenGL ES状态机,由EGL创建、并与Surface关联

Rendering Context含有OpenGL ES的客户端和服务器端状态

Rendering Context存在于客户端的地址空间。每个线程在同一时刻只能使用1个Rendering Context,每个Rendering Context在同一时刻只能被1个线程使用

Surface

OpenGL ES绘图的“画布”。EGL/OpenGL ES有3种Surface:

  • window - 用于屏上(onscreen)渲染
  • pbuffer - 用于离屏(offscreen)渲染
  • pixmap - 离屏渲染,但本地渲染API也可以访问

OpenGL支持2种渲染模式:

  • back buffered - 绘图的color buffer由EGL创建和管理,绘图完成后,EGL将后台color buffer交换/拷贝到窗口上
  • single buffered - 其color buffer为本地Pixmap,EGL能使用但不维护。OpenGL ES绘图后,像素直接在Surface上呈现

window和pbuffer Surface是back buffered模式,pixmap Surface是single buffered模式

Config

用于创建Surface,包含了Surface的各个buffer的创建参数

  • color buffer
  • depth buffer
  • multisample buffer
  • stencil buffer

相互之间的关系概括

要点:

  • 与同一Display关联的Rendering Context和Surface,才可以相互关联
  • 一个Rendering Context可以向多个Surface绘图,多个Rendering Context可以向同一个Surface绘图
  • 每个Surface有其独立的buffers

EGL函数

Display相关

eglInitialize

对每一个Display,都要初始化EGL

eglTerminate

释放EGL相关资源

Config相关

Config用于创建Surface

eglChooseConfig

获取一个Display与指定属性相匹配的Config列表

eglGetConfigs

获取一个Display所支持的所有Config列表

常用Config属性有:

属性说明

 EGL_RED_SIZE

EGL_GREEN_SIZE

EGL_BLUE_SIZE

EGL_ALPHA_SIZE

 color buffer的RGBA分量的颜色深度(位数) EGL_BUFFER_SIZE

 color buffer 的颜色深度(bpp)

EGL_RED/GREEN/BLUE/ALPHA_SIZE之和

 EGL_SURFACE_TYPE

 Surface类型,可选值为:

  • EGL_WINDOW_BIT
  • EGL_PIXMAP_BIT
  • EGL_PBUFFER_BIT
 EGL_DEPTH_SIZE depth buffer中Z的位数 EGL_SAMPLE_BUFFERS multisample buffer个数,0或1 EGL_SAMPLES number of samples per pixel EGL_STENCIL_SIZE stencil buffer个数  

Surface相关

eglCreateWindowSurface

创建window Surface(on-screen 渲染)

eglDestroySurface

释放Surface相关资源

Context相关

eglCreateContext

指定Display、Config,创建一个Rendering Context

多个Rendering Context可以共享数据,eglCreateContext()有一个参数为与其共享数据的另一个Context

eglDestroyContext

释放Context相关的资源

eglMakeCurrent

将Rendering Context绑定到当前线程,并且绑定Rendering Context与Surface

如果当前线程已经绑定了另一个Context,则原Context将解除绑定。因此可以以NULL或者EGL_NO_CONTEXT调用eglMakeCurrent来解除线程与当前Context之间的绑定关系

其他函数

eglSwapBuffers

将back buffer拷贝到窗口

eglGetError

获取最近一次EGL函数的错误代码



OpenGL ES的javax.microedition.khronos.opengles 包定义了平台无关的GL绘图指令,EGL(javax.microedition.khronos.egl )
则定义了控制displays ,contexts 以及surfaces 的统一的平台接口。

  • Display(EGLDisplay) 是对实际显示设备的抽象。
  • Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer的抽象,包括Color Buffer, Stencil Buffer ,Depth Buffer.
  • Context (EGLContext) 存储OpenGL ES绘图的一些状态信息。

使用EGL的绘图的一般步骤:

  1. 获取EGLDisplay对象
  2. 初始化与EGLDisplay 之间的连接。
  3. 获取EGLConfig对象
  4. 创建EGLContext 实例
  5. 创建EGLSurface实例
  6. 连接EGLContext和EGLSurface.
  7. 使用GL指令绘制图形
  8. 断开并释放与EGLSurface关联的EGLContext对象
  9. 删除EGLSurface对象
  10. 删除EGLContext对象
  11. 终止与EGLDisplay之间的连接。

一般来说在Android平台上开发OpenGL ES应用,无需直接使用javax.microedition.khronos.egl 包中的类按照上述步骤来使用OpenGL ES绘制图形,在Android平台中提供了一个android.opengl 包,类GLSurfaceView提供了对Display,Surface,Context 的管理,大大简化了OpenGL ES的程序框架,对应大部分OpenGL ES开发,只需调用一个方法来设置OpenGLView用到的GLSurfaceView.Renderer。可以参见

Android OpenGL ES 简明开发教程二:构造OpenGL ES View

https://www.khronos.org/registry/EGL/sdk/docs/man/html/

0 0
原创粉丝点击