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閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容