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

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容