OpenGL ES 框架详细解析(三) —— 构建用于iOS的OpenGL ES应用程序的清单

版本记录

版本号 时间
V1.0 2017.09.28

前言

OpenGL ES是一个强大的图形库,是跨平台的图形API,属于OpenGL的一个简化版本。iOS系统可以利用OpenGL ES将图像数据直接送入到GPU进行渲染,这样避免了从CPU进行计算再送到显卡渲染带来的性能的高消耗,能带来来更好的视频效果和用户体验。接下来几篇就介绍下iOS 系统的 OpenGL ES框架。感兴趣的可以看上面几篇。
1. OpenGL ES 框架详细解析(一) —— 基本概览
2. OpenGL ES 框架详细解析(二) —— 关于OpenGL ES

构建用于iOS的OpenGL ES应用程序的清单

OpenGL ES规范定义了一个平台中立的API,用于使用GPU硬件渲染图形。 实现OpenGL ES的平台提供执行OpenGL ES命令的渲染上下文,用于保存渲染结果的帧缓冲区以及呈现帧缓冲区内容进行显示的一个或多个渲染目标。 在iOS中,EAGLContext类实现了一个渲染上下文。 iOS仅提供一种类型的帧缓冲区,OpenGL ES帧缓冲区对象,GLKViewCAEAGLLayer类实现渲染目标。

在iOS中构建OpenGL ES应用程序需要几个注意事项,其中一些是OpenGL ES编程的通用,其中一些特定于iOS。 按照此清单和下面的详细部分开始:

  • 确定哪个版本的OpenGL ES具有适用于您的应用程序的功能集,并创建一个OpenGL ES上下文。
  • 在运行时验证设备是否支持您要使用的OpenGL ES功能。
  • 选择在哪里渲染您的OpenGL ES内容。
  • 确保您的应用在iOS中正常运行。
  • 实现您的渲染引擎。
  • 使用Xcode和Instruments来调试您的OpenGL ES应用程序,并调整它以获得最佳性能。

Choosing Which OpenGL ES Versions to Support - 选择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仅提供基本的固定功能图形管道,主要用于向后兼容性。

您应该选择好支持与您的应用程序最相关的功能和设备的OpenGL ES版本。 要了解有关iOS设备的OpenGL ES功能的更多信息,请阅读iOS Device Compatibility Reference

要为您打算支持的OpenGL ES版本创建上下文,请阅读Configuring OpenGL ES Contexts。 要了解OpenGL ES版本的选择与您可能在应用程序中使用的渲染算法相关,请参阅OpenGL ES Versions and Renderer Architecture


Verifying OpenGL ES Capabilities - 验证OpenGL ES功能

iOS Device Compatibility Reference总结了iOS设备上可用的功能和扩展功能。 但是,为了让应用程序尽可能多地运行设备和iOS版本,您的应用程序应始终在运行时查询OpenGL ES实现的功能。

要确定实现特定的限制,如最大纹理大小或顶点属性的最大数量,请使用适当的glGet函数为其数据查找相应令牌的值(例如,在gl.h头中找到的MAX_TEXTURE_SIZEMAX_VERTEX_ATTRIBS) 类型。

要检查OpenGL ES 3.0扩展,请使用glGetIntegervglGetStringi函数,如以下代码示例所示:

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.12.0扩展名,请调用glGetString(GL_EXTENSIONS)获取所有扩展名的空格分隔列表。


Choosing a Rendering Destination - 选择渲染目的地

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

  • GLKit框架提供了一个视图,它绘制了OpenGL ES内容并管理自己的framebuffer对象,以及支持动画化OpenGL ES内容的视图控制器。 使用这些类创建全屏视图或将OpenGL ES内容适合于UIKit视图层次结构。 要了解这些类,请参阅Drawing with OpenGL ES and GLKit

  • CAEAGLLayer类提供了一种绘制OpenGL ES内容作为Core Animation图层组合的一部分的方法。 使用此类时,必须创建自己的framebuffer对象。

  • 与任何OpenGL ES实现一样,您还可以使用帧缓冲区进行屏幕外图形处理或渲染到图形管道中其他位置的纹理。 使用OpenGL ES 3.0,可以在使用多个渲染目标的渲染算法中使用屏幕外缓冲区。

要了解如何渲染到屏幕外缓冲区,纹理或核心动画层,请参阅Drawing to Other Rendering Destinations


Integrating with iOS - 与iOS集成

默认情况下,iOS应用程序支持多任务,但是在OpenGL ES应用程序中正确处理此功能需要额外考虑。 OpenGL ES的不当使用可能导致您的应用程序在后台被系统杀死。

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

要了解支持这些和其他iOS功能,请阅读Multitasking, High Resolution, and Other iOS Features


Implementing a Rendering Engine - 实现渲染引擎

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

要了解iOS设备重要的设计注意事项,请参阅OpenGL ES Design GuidelinesConcurrency and OpenGL ES


Debugging and Profiling - 调试和分析

Xcode和Instruments为您的应用程序提供了许多跟踪渲染问题和分析OpenGL ES性能的工具。

要了解有关解决问题并提高OpenGL ES应用程序性能的更多信息,请参阅Tuning Your OpenGL ES App

后记

未完,待续~~~

推荐阅读更多精彩内容