OpenGL ES

参考About OpenGL ES
OpenGL ES Framework Reference
GLKit

Open GL(Open Graphic Library)旨在将函数调用转换为可发送到基础图形硬件的图形命令。由于此底层硬件专用于处理图形命令,因此OpenGL绘制通常非常快。
Open GL ESOpenGL的简化版,专门提供了易于学习且易于在移动设备的图形硬件中实现的库

构建适用于iOS的OpenGL ES应用程序

Open GL ES定义了和平台无关的API用于使用GPU硬件渲染图形。OpenGL ES平台提供了用于执行OpenGL ES命令的渲染上下文,用于保存渲染结果的帧缓冲区以及一个或者多个渲染目标以显示帧缓冲区内容。
在iOS中EAGLContext用于上下文,iOS仅提供了一种类型的帧缓冲区,以及GLKView和CAEAGLLayer类实现渲染目标。

在iOS中构建OpenGL ES需要考虑因素清单:

  1. 确定OpenGL ES版本,然后创建 OpenGL ES的上下文
  2. 在运行时 验证设备是否支持要使用的功能
  3. 选择渲染OpenGL ES内容的位置
  4. 确保app在iOS中正确运行
  5. 实现渲染引擎
  6. 使用Xcode和instrument进行调试 使其获得最大性能

选择OpenGL ES版本

选择app支持的3.0、2.0还是1.1,或者多个版本

  • OpenGL ES 3.0是iOS7中的新功能,添加了许多新功能,实现更高性能
  • OpenGL ES 2.0是iOS设备的基准配置文件,具有基于可编程着色器的可配置图形管线
  • OpenGL ES 1.1仅提供基本的固定功能图形流水线,并且在iOS中主要用于向后兼容。 对于要创建的OpenGL ES对应版本的上下文,可参阅Configuring OpenGL ES Contexts.

验证功能

iOS设备兼容性参考中总结了iOS设备上可用的功能和扩展。

我们应该始终在运行时 查询OpenGL ES实现的功能。
为了确定对于特定实现的限制,例如最大纹理大小和最大顶点数量,可以使用正确的glGet函数获取其数据类型(例如在gl.h标头中找到的MAX_TEXTURE_SIZE或MAX_VERTEX_ATTRIBS)。

//检查 OpenGL ES3.0的扩展,使用glGetIntegerv和glGetStringi函数
BOOL CheckForExtension(NSString *searchName)
{
    // 创建一个包含所有扩展名字的set
    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];
}

选择渲染目标

在iOS中,帧缓冲区对象存储绘图命令的结果。可以通过多种方式,使用帧缓冲区对象的内容:

  • GLKit框架提供了绘制Open GL内容并管理自己帧缓冲区对象的视图View,以及一个支持对OpenGL内容做动画的视图控制器Controller。使用这个这些类来创建全屏或者适应Open GL内容的UIKit 视图层次.参阅使用OpenGL ES和GLKit绘制
  • CAEAGLLayer类提供了一种绘制Open GLES内容的方法,作为CoreAnimation图层合成的一部分。使用这个类,必须创建自己的帧缓冲区对象
  • 也可以使用帧缓冲区进行屏幕外图形处理或者渲染为纹理,以在图形管道的其它地方使用。使用OPenGL 3.0,可以再利用多个渲染目标的渲染算法中使用屏幕外缓冲区

集成在iOS中

iOS app默认支持多任务,但是在Open GL ES应用中可能需要额外考虑。如果在后台不正确使用,就会导致应用被系统杀死。

实现渲染引擎

设计OpenGL ES绘图代码有多种可能的策略。渲染引擎设计的许多方面对于OpenGL和OpenGL ES的所有实现都是通用的。

调试和分析

InstruMENTS提供了很多工具来跟踪渲染问题并分析应用程序中的OpeGL ES性能。参阅Tuning Your OpenGL ES App.