EGL 1.0 学习笔记

4 篇文章 0 订阅

转自:http://www.cnblogs.com/bpasser/archive/2011/09/26/2191710.html


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_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函数的错误代码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用EGL进行OpenGL ES图形渲染的范例: ``` // 初始化EGL EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); EGLint major, minor; eglInitialize(display, &major, &minor); // 设置EGL属性 EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_NONE }; // 选择EGL配置 EGLConfig config; EGLint numConfigs; eglChooseConfig(display, configAttribs, &config, 1, &numConfigs); // 创建EGL窗口 EGLNativeWindowType window = createWindow(); EGLSurface surface = eglCreateWindowSurface(display, config, window, NULL); // 创建EGL上下文 EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs); // 绑定EGL上下文 eglMakeCurrent(display, surface, surface, context); // 渲染图形 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 绘制三角形等图形 // 交换缓冲区 eglSwapBuffers(display, surface); // 释放资源 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroySurface(display, surface); eglDestroyContext(display, context); eglTerminate(display); destroyWindow(window); ``` 在上面的范例中,我们首先初始化EGL,并设置了一些属性和配置。然后创建EGL窗口和上下文,并将上下文与窗口进行绑定。之后进行OpenGL ES图形渲染,并最终交换缓冲区。最后释放资源,包括EGL上下文和窗口等。需要注意的是,在实际开发中,可能还需要进行错误处理和异常处理等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值