版本記錄
版本號 | 時間 |
---|---|
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幀緩沖區對象,GLKView
和CAEAGLLayer
類實現渲染目標。
在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_SIZE
或MAX_VERTEX_ATTRIBS
) 類型。
要檢查OpenGL ES 3.0
擴展,請使用glGetIntegerv
和glGetStringi
函數,如以下代碼示例所示:
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.1
和2.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 Guidelines 和 Concurrency and OpenGL ES。
Debugging and Profiling - 調試和分析
Xcode和Instruments為您的應用程序提供了許多跟蹤渲染問題和分析OpenGL ES性能的工具。
要了解有關解決問題并提高OpenGL ES應用程序性能的更多信息,請參閱Tuning Your OpenGL ES App。
后記
未完,待續~~~