OpenGL ES Programming Guide(2)
本文是苹果官方文档的翻译,由于本人水平有限,文中难免有错漏之处,请批评指正。原文链接
构建OpenGL ES iOS应用程序清单
OpenGL ES规范定义了一个平台中立的API,它使用GPU硬件渲染图形。 实现了OpenGL ES的平台需要提供执行OpenGL ES命令的渲染上下文、用于保存渲染结果的帧缓冲区以及呈现帧缓冲区内容的一个或多个渲染目的地(多指屏幕)。 在iOS中,EAGLContext类实现了一个渲染上下文,iOS仅提供一种类型的帧缓冲区,使用OpenGL ES帧缓冲区对象,GLKView和CAEAGLLayer类实现渲染目标。
在iOS中构建OpenGL ES应用程序需要注意一下几点,其中一些对于OpenGL ES编程是通用的,其中一些是特定于iOS的。 按照此清单和下面的详细部分开始编程吧。
1. 确定哪个版本的OpenGL ES适合您的应用程序,并创建一个OpenGL ES上下文。
2. 在运行时验证设备是否支持你要使用的OpenGL ES功能。
3. 选择在哪里渲染你的OpenGL ES内容。
4. 确保的应用在iOS上可以正常运行。
5. 实现您的渲染引擎。
6. 使用Xcode和Instruments调试您的OpenGL ES应用,并调整它以获得最佳性能。
选择支持的OpenGL ES版本
决定您的应用程序是否应该支持OpenGL ES 3.0,OpenGL ES 2.0,OpenGL ES 1.1或多个版本。
OpenGL ES 3.0是iOS 7中的新功能。它增加了许多新的特性,使用更高性能、更通用GPU计算技术,实现了更
复杂的视觉效果,这些效果以前只能在桌面级硬件以及游戏中实现。
OpenGL ES 2.0是iOS设备的标准配置文件,具有基于可编程着色器的可配置图形管线。
OpenGL ES 1.1仅提供基本的固定功能图形管线,主要用于向后兼容其他的iOS版本。
您应该确定一个或几个与你的应用特性最相关的OpenGL ES版本,要了解有关iOS设备OpenGL ES功能的更多信息,请阅读iOS设备兼容性参考。
要为您打算支持的OpenGL ES版本创建上下文,请阅读配置OpenGL ES上下文。要了解怎样选择OpenGL ES版本与你在应用程序中使用的渲染算法相关,请参阅OpenGL ES版本和渲染器架构。
Verifying OpenGL ES Capabilities
iOS设备兼容性参考汇总了可用于iOS设备的功能和扩展。但是,为了让应用程序尽可能地运行多种设备和iOS版本上,您的应用程序应始终在运行时查询OpenGL ES实现的功能。
要决定实现特定的限制,例如最大纹理大小或顶点属性的最大数量,请使用glGet函数通过相应令牌查询(例如,gl.h头文件中的MAX_TEXTURE_SIZE或MAX_VERTEX_ATTRIBS属性)。
要检查OpenGL ES 3.0扩展,请使用glGetIntegerv和glGetStringi函数,如以下代码所示:
BOOL CheckForExtension(NSString *searchName) {
//Create a set containing all 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++) {
[extensions addObject: @((char *)glGetStringi(GL_EXTENSIONS, i))];
}
return [extensions containsObject: searchName];
}
要检查OpenGL ES1.1和2.0的扩展,可以调用glGetString(GL_EXTENSIONS)获取所有扩展的列表。
选择渲染目的地
在iOS中,帧缓冲区对象存储绘图命令的结果。(iOS不实现窗口系统提供的帧缓冲区。)你可以通过多种方式使用帧缓冲区对象的内容:
- GLKit框架提供了一个视图,它绘制了OpenGL ES内容并管理自己的帧缓冲区对象,以及支持动画化OpenGL ES内容的视图控制器。使用这些类创建全屏视图或将OpenGL ES内容适用于UIKit视图层次结构。要了解这些类,请阅读使用OpenGL ES和GLKit绘图。
- CAEAGLLayer类提供了一种绘制OpenGL ES内容作为Core Animation组合图层一部分的方法。使用此类时必须创建自己的帧缓冲区对象。
- 与任何OpenGL ES实现一样,您还可以使用帧缓冲区进行屏幕外图形处理或渲染到图形管线中其他位置的纹理。使用OpenGL ES 3.0,可以在渲染算法中使用屏幕外缓冲区,这些算法可以利用多个渲染目标。
要了解如何渲染到屏幕外缓冲区,纹理或核心动画层,请阅读绘图到其他渲染区域。
与iOS集成
iOS应用程序默认情况下支持多任务处理,但在OpenGL ES应用程序中正确处理此功能需要额外进行思考。 OpenGL ES的不当使用可能导致您的应用程序在后台被系统结束。
许多iOS设备包含高分辨率显示器,因此您的应用程序应支持多种显示尺寸和分辨率。
要支持这些和其他iOS功能,请阅读多任务,高分辨率和其他iOS功能。
实现渲染引擎
设计OpenGL ES绘图代码有许多可能的策略,其全部细节超出了本文档的讨论范围。渲染引擎设计的许多方面对OpenGL和OpenGL ES的实现都是通用的。
要了解iOS设备重要的设计注意事项,请阅读OpenGL ES设计指南和并发和OpenGL ES。
调试和分析
Xcode和Instruments为您的应用程序提供了许多用于跟踪渲染问题和分析OpenGL ES性能的工具。
要了解有关解决问题并提高OpenGL ES应用程序性能的更多信息,请参阅调整OpenGL ES应用程序。