OpenGL ES之旅(二)-- OpenGL ES 了解GLKit框架

在介紹GLKit框架之前,我們先來了解一下EGL的概念,以便于我們了解App的管理資源模型。

EGL

EGL(Embedded Graphics Library),由于OpenGL ES是基于C的API,因此它?常便攜且受到?廣泛?支持。作為C API,它與Objective-C Cocoa Touch應?用程序?無縫集成。OpenGL ES規范沒有定義窗?口層; 相反,托管操作系統必須提供函數來創建?一個接受命令的OpenGL ES 渲染上下?文和?一個幀緩沖區,其中寫入任何繪圖命令的結果。在iOS上使?用OpenGL ES需要使?用iOS類來設置和呈現繪圖表?面,并使?平臺中立的API來呈現其內容。

  • OpenGL ES 命令需要渲染上下?和繪制表?才能完成圖形圖像的繪制
  • 渲染上下文: 存儲相關OpenGL ES 狀態
  • 繪制表面: 是?用于繪制圖元的表?,它指定渲染所需要的緩存區類型,例例如顏?緩存 區,深度緩沖區和模板緩存區.
  • OpenGL ES API 并沒有提供如何創建渲染上下?或者上下?如何連接到原生窗?系統. EGL 是Khronos 渲染API(如OpenGL ES) 和原?生窗?系統之間的接口. 唯??持 OpenGL ES 卻不?持EGL 的平臺是iOS. Apple 提供??的EGL API的iOS實現,稱為EAGL
  • 因為每個窗?系統都有不同的定義,所以EGL提供基本的不透明類型—EGLDisplay, 這 個類型封裝了所有系統相關性,?于和原生窗?系統接?

GLKit

框架概述

GLKit 框架的設計目標是為了簡化基于OpenGL / OpenGL ES 的應?用開發。它的出現加快OpenGL ES或OpenGL應?用程序開發。 使?數學庫,背景紋理加載,預先創建的著色?效果,以及標準視圖和視圖控制器來實現渲染循環。
GLKit框架提供了功能和類,可以減少創建新的基于著??的應?程序所需的?作量,或者支持依賴早期版本的OpenGL ES或者OpenGL提供的固定函數頂點或者片段處理的現有應用程序。
GLKView:提供繪制場所(View)
GLKViewController:擴展于標準的UIKit設計模式,用于繪制視圖內容的管理與呈現
注意:雖然蘋果棄用了OpenGL ES,但是iOS開發者可以繼續使用相關的API進行編程。

GLKit框架的API介紹

GLKit的功能

  • 加載紋理
  • 提供高性能的數學運算
  • 提供常見的著色器
  • 提供視圖以及視圖控制器

GLKit紋理加載

GLKTextureInfo創建OpenGL紋理信息

  • name:OpenGL上下文中紋理名稱
  • target:紋理綁定的目標
  • height:加載紋理的高度
  • width:加載紋理的寬度
  • textureOrigin:加載紋理中的原點位置
  • alphaState:加載紋理中alpha分量狀態
  • containsMipmaps:布爾值,加載的紋理中是否包含mip貼圖

GLKTextureLoader簡化從各種資源文件中加載紋理

  • 初始化
-initWithSharegroup: 初始化?個新的紋理加載到對象中
-initWithShareContext: 初始化?個新的紋理加載對象
  • 從文件中加載處理
+textureWithContentsOfFile:options:errer: 從文件加載2D紋理圖像并從數據中創建新的紋理
-textureWithContentsOfFile:options:queue:completionHandler: 從?件中異步加載2D紋理圖像,并根據數據創建新紋理
  • 從URL加載紋理
-textureWithContentsOfURL:options:error: 從URL加載2D紋理圖像并從數據創建新紋理
-textureWithContentsOfURL:options:queue:completionHandler: 從URL異步加載2D紋理圖像,并根據數據創建新紋理
  • 從內存中表示創建紋理
+textureWithContentsOfData:options:errer: 從內存空間加載2D紋理圖像,并根據數據創建新紋理
-textureWithContentsOfData:options:queue:completionHandler:從內存空間異步加載2D紋理圖像,并從數據中創建新紋理
  • 從CGImages創建紋理
-textureWithCGImage:options:error: 從Quartz圖像加載2D紋理圖像并從數據創建新紋理
-textureWithCGImage:options:queue:completionHandler: 從Quartz圖像異步加載2D紋理圖像,并根據數據創建新紋理
  • 從URL加載多維創建紋理
+cabeMapWithContentsOfURL:options:errer: 從單個URL加載??體貼圖紋理圖像,并根據數據創建新紋理
-cabeMapWithContentsOfURL:options:queue:completionHandler:從單個URL異步加載?方體貼圖紋理圖像,并根據數據創建新紋理
  • 從?件加載多維數據創建紋理
+cubeMapWithContentsOfFile:options:errer: 從單個文件加載立方體貼圖紋理對象,并從數據中創建新紋理
-cubeMapWithContentsOfFile:options:queue:completionHandler:從單個文件異步加載?方體貼圖紋理對象,并從數據中創建新紋理
+cubeMapWithContentsOfFiles:options:errer:從?系列?件中加載立方體貼圖紋理圖像,并從數據總創建新紋理
-cubeMapWithContentsOfFiles:options:options:queue:completionHandler:從?系列?件異步加載立?體貼圖紋理圖像,并從數據中創建新紋理

GLKit中OpenGL ES 的視圖渲染

GLKView使用OpenGL ES 繪制內容的視圖默認實現

  • 初始化視圖
- initWithFrame:context: 初始化新視圖
  • 代理
delegate 視圖的代理
  • 配置幀緩存區對象
drawableColorFormat 顏色渲染緩存區格式
drawableDepthFormat 深度渲染緩存區格式
drawableStencilFormat 模板渲染緩存區的格式
drawableMultisample 多重采樣緩存區的格式
  • 幀緩存區屬性
drawableHeight 底層緩存區對象的?度(以像素為單位)
drawableWidth 底層緩存區對象的寬度(以像素為單位)
  • 繪制視圖的內容
context 繪制視圖內容時使?的OpenGL ES 上下?
-bindDrawable 將底層FrameBuffer 對象綁定到OpenGL ES
enableSetNeedsDisplay 布爾值,指定視圖是否響應使得視圖內容無效的消息
-display 立即重繪視圖內容
snapshot 繪制視圖內容并將其作為新圖像對象返回
  • 刪除視圖FrameBuffer對象
- deleteDrawable 刪除與視圖關聯的可繪制對象

GLKViewDelegate 用于GLKView 對象回調方法

  • 繪制視圖的內容
- glkView:drawInRect: 繪制視圖內容 (必須實現代理)

GLKViewController 管理理OpenGL ES 渲染循環的視圖控制器

  • 更新
 - (void)update 更新視圖內容
 - (void)glkViewControllerUpdate:
  • 配置幀速率
preferredFramesPerSecond 視圖控制?調用視圖以及更新視圖內容的速率
framesPerSencond 視圖控制器調用視圖以及更新其內容的實際速率
  • 配置GLKViewController 代理
delegate 視圖控制?的代理
  • 控制幀更更新
paused 布爾值,渲染循環是否已暫停
pausedOnWillResignActive 布爾值,當前程序重新激活動狀態時視圖控制器是否?動暫停渲染循環
resumeOnDidBecomeActive 布爾值,當前程序變為活動狀態時視圖控制是否?動恢復呈現循環
  • 獲取有關View更新信息
frameDisplayed 視圖控制?自創建以來發送的幀更新數
timeSinceFirstResume ?視圖控制器第?次恢復發送更新事件以來經過的時間量
timeSinceLastResume ?上次視圖控制?恢復發送更新事件以來更新的時間量
timeSinceLastUpdate ?上次視圖控制?調?委托?法以及經過的時間量
timeSinceLastDraw ?上次視圖控制?調?視圖display?法以來經過的時間量

GLKViewControllerDelegate 渲染循環回調?法

  • 處理更新事件
- glkViewControllerUpdate: 在顯示每個幀之前調?
  • 暫停/恢復通知
- glkViewController:willPause: 在渲染循環暫停或恢復之前調?

GLKBaseEffect 一種簡單光照/著色系統,?于基于著?器OpenGL渲染

  • 命名Effect
label 給Effect(效果)命名
  • 配置模型視圖轉換
transform 綁定效果時應?于頂點數據的模型視圖,投影和紋理理變換
  • 配置光照效果
ightingType 用于計算每個?段的光照策略,GLKLightingType
- GLKLightingTypePerVertex 表示在三?形中每個頂點執?光照計算,然后在三?形進行插值
- GLKLightingTypePerPixel 表示光照計算的輸?在三?形內插入,并且在每個?段執?光照計算
  • 配置光照
lightModelTwoSided 布爾值,表示為基元的兩側計算光照
material 計算渲染圖元光照使?的材質屬性
lightModelAmbientColor 環境顏色,應?效果渲染的所有圖元
light0 場景中第?個光照屬性
light1 場景中第?個光照屬性
light2 場景中第三個光照屬性
  • 配置紋理
texture2d0 第?個紋理屬性
texture2d1 第?個紋理屬性
textureOrder 紋理應?于渲染圖元的順序
  • 配置霧化
fog 應?于場景的霧屬性
  • 配置顏?信息
colorMaterialEnable 布爾值,表示計算光照與材質交互時是否使?顏?頂點屬性
useConstantColor 布爾值,指示是否使用常量顏?
constantColor 不提供每個頂點顏?數據時使?常量顏?
  • 準備繪制效果
- prepareToDraw 準備渲染效果

--
總結:到這兒,GLKit中的常用API基本就是這些,后續還會繼續補充進來。如有書寫錯誤,注釋錯誤,方法使用錯誤還請指出,非常感謝!

--

系列文章:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容