`
sogotobj
  • 浏览: 617727 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

OpenGL ES on iOS

阅读更多

iOS Graphics Overview

core animation是ios图形子系统的基础,UIView对象由core animation layer支持。各种各样的layer更新他们的内容,由core animation动画和合成,并向显示设备呈现。OpenGL ES是Core Animation的客户,要使用OpenGL ES需要创建一个UIView,这个UIView由一个特殊的core animation layer支持,这个特殊的layer是一个CAEAGLLayer对象。CAEAGLLayer是OpenGLES和core animation联系的桥梁。当应用程序渲染完一帧后,CAEAGLLayer的内容被呈现并且和其他view的数据组合。


Overview of OpenGL ES

OpenGL ES命令被提交到rendering context。这些命令可以读取context的状态,改变context的状态,创建修改和销毁OpenGL ES Object,以及提交被渲染的几何体,几何体通过流水线处理最终光栅化到framebuffer。

renderbuffer: 是某种特定格式的2d图形。格式可以是颜色信息,也可以是深度或模板信息。renderbuffer一般不单独使用,而是被收集作为fraembuffer的一部分使用。

Framebuffers: 是图形流水线的最终目的地。一个framebuffer object其实是一个容器,包含了attach上去的纹理和renderbuffer。


iOS Classes

所有的OpenGL ES实现需要提供平台相关的代码创建rendering context用于绘制到屏幕。iOS通过一个Objective-C的接口EAGL实现。几个主要的类:

EAGLContext : 定义了rendering context。应用程序创建和初始化一个EAGLContext,设定他为当前的OpenGL命令的目标。OpenGL命令通常存放在一个context所维护的队列里面,并在之后被执行。EAGLContext也提供了方法将图像呈现给Core Animation。

EAGLSharegroup: 每个EAGLContext对象包含一个EAGLSharegroup对象的引用。当OpenGL ES需要为context分配一个对象时,实际是sharegroup分配并维护对象。这样可以让多个context共享对象。另一种共享对象的方法是单个context,多个framebuffer object,这种情况下不需要切换context,而需要切换target for rendering。

EAGLDrawable Protocol: CAEAGLLayer实现了这个协议,从而可以将OpenGLES renderbuffers和Core Animation图形系统联系起来。


确定OpenGL ES能力

在初始化OpenGL ES rendering context(即EAGLContext)的时候可以确定设备支持的OpenGL ES版本。
创建使用es 1.1的context:
EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
创建使用es 2.0的context:
EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
如果OpenGL ES的某个实现不支持,initWithAPI会返回nil。
所以,如果想同时支持2.0和1.1,先测试是否能创建2.0的context,如果返回nil,则创建1.1的。
context初始化后,从他的API属性可知道所支持的OpenGL ES版本。


Working with OpenGL ES Contexts and Framebuffers

1)创建EAGL Context
EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
[EAGLContext setCurrentContext: myContext];

2)创建 Framebuffer Objects
es2.0直接支持fbo, ios的es1.1通过GL_OES_FRAMEBUFFER_OBJECT扩展支持。fbo允许应用程序精确的控制color,depth,stencil targets的创建。这些targets通常是renderbuffers,即具有一定宽度高度和格式的2d图形像素,另外color target可以指向一个纹理。创建framebuffer的过程是:1 创建一个frame buffer object 2 创建一个或多个targets(renderbuffers or textures),给他们分配空间并attach到fbo上 3 测试framebuffer的完整性。

创建renderbuffer,可以是offscreen, texture(仅限color), Drawable(通过EAGLLayer)




分享到:
评论
2 楼 wangyuchun_799 2011-11-17  
文章留下了,哈哈
1 楼 wangyuchun_799 2011-11-17  
[color=darkred]写的太好了,网上很难找到类似详细而又易懂的文章。以致我冲动的注册了新账号好给你留下评论。继续加油啊,希望你有时间再多写一点,再扩充一下!期待你的更新⋯⋯ :shock: [/color]

相关推荐

Global site tag (gtag.js) - Google Analytics