iOS 中 OpenGL ES的兩種創建方式GLKit和CAEAGLLayer的區別

OpenGL ES是一套多功能開放標準的用於嵌入系統的C-based的圖形庫,用於2D和3D數據的可視化。OpenGL被設計用來轉換一組圖形調用功能到底層圖形硬件(GPU),由GPU執行圖形命令,用來實現複雜的圖形操作和運算,從而能夠高性能、高幀率利用GPU提供的2D和3D繪製能力。

OpenGL ES規範本身不定義繪製表面和繪製窗口,因此ios爲了使用它必須提供和創建一個OpenGLES 的呈現環境,創建和配置存儲繪製命令結果的framebuffer 及創建和配置一個或多個呈現目標。

在 iOS中使用EAGL提供的EAGLContext類 來實現和提供一個呈現環境,用來保持OpenGLES使用到的硬件狀態。  EAGL是一個Objective-C API,提供使OpenGL ES與Core Animation和UIKIT集成的接口。

在調用任何OpenGLES 功能之前必須首先初始化一個EAGLContext 對象。

每一個iOS應用的每一個線程都有一個當前context,在調用OpenGLES函數時,使用或改變此context中的狀態。

EAGLContext 的類方法setCurrentContext:用來設置當前線程的當前context。EAGLContext 的類方法currentContext 返回當前線程的當前context。在切換相同線程的兩個上下文之前,必須調用glFlush函數來確保先前已提交的命令被提交到圖形硬件中。

可以採用不同的方式使用OpenGL ES以便呈現OpenGL ES內容到不同的目標:GLKit和CAEAGLLayer。

爲了創建全屏幕的視圖或使OpenGL ES內容與UIKit視圖集成,可以使用GLKit。在使用GLKit時,GLKit提供的類GLKView類本身實現呈現目標及創建和維護一個framebuffer。

爲了使OpenGL ES內容作爲一個Core Animation層的部分內容時,可以使用CAEAGLLayer 作爲呈現目標,並需要另外創建framebuffer以及自己實現和控制整個繪製流程。

GLKit是一組Objective-C 類,爲使用OpenGL ES 提供一個面向對象接口,用來簡化OpenGL ES應用的開發。GLKit支持四個3D應用開發的關鍵領域:

1) GLKView 和GLKViewController類提供一個標準的OpenGLES視圖和相關聯的呈現循環。GLKView可以作爲OpenGLES內容的呈現目標,GLKViewController提供內容呈現的控制和動畫。視圖管理和維護一個framebuffer,應用只需在framebuffer進行繪畫即可。

2)GLKTextureLoader 爲應用提供從iOS支持的各種圖像格式的源自動加載紋理圖像到OpenGLES 圖像環境的方式,並能夠進行適當的轉換,並支持同步和異步加載方式。

3)數學運算庫,提供向量、矩陣、四元數的實現和矩陣堆棧操作等OpenGL ES 1.1功能。

4)Effect效果類提供標準的公共着色效果的實現。能夠配置效果和相關的頂點數據,然後創建和加載適當的着色器。GLKit 包括三個可配置着色效果類:GLKBaseEffect實現OpenGL ES 1.1規範中的關鍵的燈光和材料模式, GLKSkyboxEffect提供一個skybox效果的實現, GLKReflectionMapEffect 在GLKBaseEffect基礎上包括反射映射支持。

使用GLKView和OpenGLES進行繪製過程:

1)創建一個GLKView 對象

GLKView 對象可以編程或使用Interface Builder來創建和配置。

在採用編程方式時,首先創建一個context然後調用initWithFrame:context:方法。

使用Interface Builder方式時,在從storyboard加載一個GLKView後,創建一個context和設置它作爲視圖的context屬性.

在iOS中GLKit的使用需要創建OpenGL ES 2.0以上的圖形環境context。

GLKit視圖自動創建和配置它所有的OpenGLES framebuffer對象和renderbuffers,可以通過修改視圖的drawable屬性來控制這些對象的屬性。

2)繪製OpenGL內容(發佈繪製命令)

使用GLKit視圖繪製OpenGL內容需要三個子步驟:準備OpenGLES基礎;發佈繪製命令;呈現顯示內容到Core Animation。       GLKit類本身已經實現了第一個和第三個步驟,用戶只需實現第二個步驟,在視圖的方法drawRect或視圖的代理對象的glkView:drawInRect:中調用適當的OpenGLES繪製命令進行內容繪製。

GLKViewController類維護一個animation 呈現循環(包含兩個方法update和display),用來實現連續的動畫複雜的場景。

animation 呈現循環的交替速率由GLKViewController的屬性framesPerSecond 指示,並使用preferredFramesPerSecond 屬性來修改它。

參考鏈接:https://www.cnblogs.com/feng9exe/p/9255302.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章