EGL 1.0 学习笔记

EGL Specification 1.0 的研读笔记

我的“Android OpenGL ES 1.x 教程的Native实现”中有Android平台下EGL的创建、销毁的代码

基本概念

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

相互之间的关系概括

EGL 1.0 学习笔记

要点:

  • 与同一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函数的错误代码

你可能感兴趣的:(学习笔记)