OpenGL ES 框架詳細解析(三) —— 構建用於iOS的OpenGL ES應用程式的清單

weixin_34321977發表於2017-09-28

版本記錄

版本號 時間
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

後記

未完,待續~~~

3691932-90e0955146b43106.jpg

相關文章