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
相互之间的关系概括
要点:
- 与同一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_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函数的错误代码
posted on 2011-09-26 15:51 bye_passer 阅读(10205) 评论(0) 编辑 收藏 举报