为iOS构建OpenGL ES应用程序的清单
OpenGL ES规范定义了一个平台中立的API,用于使用GPU硬件渲染图形。实现OpenGL ES的平台提供执行OpenGL ES命令的渲染上下文,用于保存渲染结果的帧缓冲区以及呈现帧缓冲区内容进行显示的一个或多个渲染目标。在iOS中,EAGLContext类实现了一个渲染上下文。 iOS仅提供一种类型的帧缓冲区,OpenGL ES帧缓冲区对象,GLKView和CAEAGLLayer类实现渲染目标。
在iOS中构建OpenGL ES应用程序需要几个注意事项,其中一些是OpenGL ES编程的通用,其中一些是特定于iOS的。按照此清单和下面的详细部分开始:
- 确定哪个版本的OpenGL ES具有适合您应用程序的功能集(目前iOS支持OpenGLES2、OpenGLES3),并创建一个OpenGL ES上下文。
- 在运行时验证设备是否支持您要使用的OpenGL ES功能。
- 选择在哪里渲染您的OpenGL ES内容。
- 确保您的应用程序在iOS中正常运行。
- 实现您的渲染引擎。
- 使用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版本和渲染器架构。
验证OpenGL ES功能
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 ES 1.1和2.0扩展名,请调用glGetString(GL_EXTENSIONS)获取所有扩展名的空格分隔列表。
选择呈现目的地
在iOS中,一个framebuffer对象存储绘图命令的结果。 (iOS不实现窗口系统提供的帧缓冲区。)可以通过多种方式使用framebuffer对象的内容:
- GLKit框架提供了一个视图,它绘制了OpenGL ES内容并管理自己的framebuffer对象,以及支持动画化OpenGL ES内容的视图控制器。使用这些类创建全屏视图或将OpenGL ES内容适合于UIKit视图层次结构。要了解这些类,请阅读使用OpenGL ES和GLKit绘图。
- CAEAGLLayer类提供了一种绘制OpenGL ES内容作为Core Animation图层组合的一部分的方法。使用此类时必须创建自己的framebuffer对象。
- 与任何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应用程序。