OpenGL ES Programming Guide for iOS 之 iOS 中的OpenGL ES

8 篇文章 0 订阅
4 篇文章 0 订阅

iOS 中的OpenGL ES

 

OpenGL ES的规范定义了使用GPU硬件渲染图形的平台无关的API。平台 实现OpenGLES时提供了一个渲染上下文,用于执行OpenGLES命令,帧缓存用来保持渲染结果,而呈现出的帧缓冲用于对其中的内容进行一个或多个渲染目的地 显示。在iOS上,EAGLContext类实现一个渲染上下文。iOS只提供一种帧缓冲,OpenGLES帧缓冲区对象,GLKView和CAEAGLLayer类实现渲染的目的地。

 

在iOS中建立一个OpenGLES应用程序需要几个因素,其中一些是通用的OpenGLES的 编程的,有些则是专门针对iOS的。按照这个清单和详细描述开始进行:

1,        确定某个OpenGL ES版本作为应用程序的功能集,并创建一个OpenGL ES 上下文。

2,        确认在该设备支持使用的OpenGL ES的功能。

3,        选择在哪里渲染OpenGL ES内容。

4,        确保iOS能正常运行应用程序。

5,        实现渲染引擎。

6,        使用Xcode和工具来调试OpenGL ES应用程序并对其进行优化以获得最佳性能。

 

选择支持的OpenGL ES版本

必须回答的一个关键的问题是应用程序是否支持OpenGLES3.0、OpenGLES 2.0、OpenGL ES的1.1,或多个版本。目标版本或OpenGLES版本应该是功能和设备都和应用程序功能相关的版本。要了解准备支持创建上下文的OpenGLES的版本,请阅读“配置的OpenGLES上下文”(第17页)。

OpenGL ES 3.0

在iOS7中支持OpenGLES3.0,并增加了许多新功能,包括:

●  多重渲染目标,改造的反馈延迟渲染和其他图形算法,这些以前在桌面OpenGL只提供

●  OpenGL着色语言ES3.0和整数纹理,缓冲器和操作,通用GPU计算

●  新的纹理,缓冲,和属性格式,优化内存占用和带宽

OpenGL ES3.0只适用于某些iOS设备。

 

OpenGL ES 2.0

OpenGL ES 2.0基于可编程着色器,由iOS5或更高版本支持的所有设备。虽然上述功能仅适用于支持OpenGLES3.0的设备,但iOS的提供了OpenGLES 2.0扩展,支持许多OpenGLES3.0提供的功能。

OpenGL ES 1.1

OpenGL ES1.1只提供了基本的固定功能图形管道。

 

支持多个OpenGL ES版本

如果应用程序使用OpenGLES3.0,来采取新的更强大的图形处理器的优势iOS设备,还必须提供由iOS7支持的其他设备,来提供OpenGLES 2.0的渲染选项。 如果还维护着一个OpenGLES1.1应用程序,你应该考虑用新的OpenGLES 版本更新你的代码。在这个过渡时期学习GLKit框架能够获得帮助,阅读“使用GLKit开发渲染器“(第29页)。

 

验证OpenGL ES的能力

iOS Device Compatibility Reference总结了适用于iOS的执行能力和设备扩展 。然而,为了使应用程序在尽可能多的设备和iOS版本上运行,可能的话,应用程序应该 总是在运行时查询的OpenGLES实现能力。

 

要确定具体实施的限制,如最大纹理尺寸或顶点的最大数目属性,查找值对应的标记(如MAX_TEXTURE_SIZE或MAX_VERTEX_ATTRIBS,如使用适当的glGet函数,它的数据类型在了gl.h标头中可以找到)。

 

检查OpenGL ES3.0扩展,使用glGetIntegerv和glGetStringi函数,如下面的代码示例:

BOOLCheckForExtension(NSString *searchName)

{

// Create a set containingall extension names.

// (For better performance,create the set only once and cache it for future

use.)

int max = 0;

glGetIntegerv(GL_NUM_EXTENSIONS,&max);

NSMutableSet *extensions =[NSMutableSet set];

for (int i = 0; i < max;i++)

{

[extensionsaddObject: @( (char *)glGetStringi(GL_EXTENSIONS, i) )];

}

return [extensionscontainsObject: searchName];

}

 

检查OpenGL ES1.1和2.0扩展,调用glGetString(GL_EXTENSIONS),以获得一个空格分隔 所有的扩展名列表。

 

选择一个渲染目标

在iOS中,帧缓冲区对象存储绘图命令的结果。 (iOS的未实现窗口系统提供的帧缓存),可以使用多种方式与帧缓存对象的内容:

●  GLKit框架提供view来绘制OpenGLES的内容和管理自己的帧缓冲视图的对象,视图控制器支持动画的OpenGLES内容。使用这些类来创建完整屏幕视图,以适合OpenGLES内容填充到UIKit的视图层次结构中。要了解这些类, 阅读“OpenGLES和GLKit绘图”(第21页)。

●  CAEAGLLayer类作为核心动画层的一部分,提供了一种方法来绘制OpenGLES的内容。使用这个类的时候必须创建自己的帧缓冲区对象。

●  正如任何的OpenGLES实现,也可以使用帧缓冲进行离屏图形处理 或渲染到纹理用于图形管线。在OpenGLES3.0,离屏缓冲可以在多个渲染目标的使用算法。

 

要了解屏幕外缓冲渲染,纹理或核心动画层,读“绘制到其他 渲染目的地“(第30页)。

iOS整合

iOS应用程序默认支持多任务,但正确处理这个功能在OpenGLES应用程序需要 额外代价。使用不当的OpenGLES可导致您的应用程序在后台时系统终止。

许多iOS设备,包括高分辨率显示,因此应用程序应该支持多种显示尺寸和方案。

要了解支持这些和其他iOS功能,请阅读“多任务处理,高分辨率,和其他的iOS

功能“(第41页)。

实现一个渲染引擎

OpenGL ES绘图代码中有许多可能的设计策略,其中的全部细节超出了本文的范围。渲染引擎设计的许多方面是通用于所有的OpenGL和OpenGLES的实现。

要了解iOS设备的设计考虑很重要,请阅读“OpenGL ES设计指南”(页46)和“并发和OpenGLES”(第63页)。

 

调试和性能分析

Xcode和工具提供了大量的工具来跟踪渲染的问题与分析 OpenGLES的表现。

要了解更多有关解决问题和改善你的OpenGL ES应用程序的性能,请阅读“调整OpenGLES应用程序“(第55页)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值