iOS開發(fā)之OpenGL ES(一)—初見

前言:

這篇文章是作者iOS開發(fā)之OpenGL ES系列文章的第一篇,作者也是在不斷地學(xué)習(xí)中,后期會陸續(xù)的循序漸進(jìn)的推出系列文章,希望有志學(xué)習(xí)OPenGL ES的同學(xué)和篇主一起進(jìn)步哦。
注:(如果你覺得我的文章有所幫助,點(diǎn)個(gè)喜歡或關(guān)注。您的每一份鼓勵都是我前進(jìn)的動力??)

正文:

OpenGL ES:是蘋果iOS設(shè)備上的用戶界面和圖形揮之能力的基礎(chǔ)。“ES”代表嵌入式系統(tǒng)(Embeded System)。
在進(jìn)入正題之前,先介紹幾個(gè)基本的概念:

3D渲染:

圖形處理單元(GPU)就是能夠結(jié)合幾何、顏色、燈光和其他數(shù)據(jù)而產(chǎn)生一個(gè)屏幕圖像的硬件組件。屏幕只有2維,因此顯示3D數(shù)據(jù)的技巧就在于產(chǎn)生能夠迷惑眼睛使其看到丟失的第三維的一個(gè)圖像。用3D數(shù)據(jù)生成一個(gè)2D圖像的過程就叫做渲染。在計(jì)算機(jī)上顯示的圖片是由矩形的顏色點(diǎn)組成的,這些矩形的顏色點(diǎn)叫做像素。如果通過放大鏡仔細(xì)觀察顯示器,你會發(fā)現(xiàn)每個(gè)像素都是由紅、綠、藍(lán)3個(gè)元素組成的。

為圖形處理器提供數(shù)據(jù):

程序會保存3D場景數(shù)據(jù)到硬件隨機(jī)存儲器在(RAM)中。嵌入式中央處理單元有專門為其分配的RAM。
OpenGL ES是一種軟件技術(shù)。OpenGL ES部分運(yùn)行在CPU上,部分運(yùn)行在GPU上。OPenGL ES橫跨在兩個(gè)處理器之間,協(xié)調(diào)兩個(gè)內(nèi)存區(qū)域之間的數(shù)據(jù)交換。
緩存,提供數(shù)據(jù)的最好方式。OpenGL ES為兩個(gè)內(nèi)存區(qū)域間的數(shù)據(jù)交換定義了緩存的概念。緩存的概念是指GPU圖形處理器能夠控制和管理的連續(xù)的RAM。通過控制獨(dú)立的緩存,GPU就能盡可能以最有效的方式讀寫內(nèi)存。圖形處理器把它處理大量數(shù)據(jù)的能力異步同時(shí)地應(yīng)用到緩存上,這意味著在GPU使用緩存中的數(shù)據(jù)工作的同時(shí),運(yùn)行在CPU上的程序可以繼續(xù)執(zhí)行。
幾乎所有程序提供給GPU的數(shù)據(jù)都應(yīng)該放入緩存中。緩存存儲的到底是幾何數(shù)據(jù)、顏色,燈光效果,還是其他的信息并不重要。為緩存提供數(shù)據(jù)有以下7個(gè)步驟:

  • 生成(Generate)-請求OpenGL ES為圖形處理器控制的緩存生成一個(gè)人獨(dú)一無二的額標(biāo)識符。
  • 綁定(Bind)-告訴OPenGL ES為接下來的運(yùn)算使用一個(gè)緩存。
  • 緩存數(shù)據(jù)(Buffer Data)-讓OpenGL ES為當(dāng)前綁定的緩存分配并初始化足夠的連續(xù)內(nèi)存(通常是從CPU控制的內(nèi)存復(fù)制數(shù)據(jù)到分配的內(nèi)存)。
  • 啟用(Enable)或者禁止(Disable)-告訴OpenGL ES在接下來的渲染中是否使用緩存中的數(shù)據(jù)。
  • 設(shè)置指針(Set Pointers)-告訴OpenGL ES在緩存中的數(shù)據(jù)的類型和所有需要訪問的數(shù)據(jù)的內(nèi)存偏移值。
  • 繪圖(Draw)-告訴OpenGL ES使用當(dāng)前綁定并啟用的緩存中的數(shù)據(jù)渲染整個(gè)場景或者某個(gè)場景中的一部分。
  • 刪除(Delete)-告訴OpenGL ES刪除以前生成的緩存并釋放相關(guān)的資源。
    OpenGL ES為一種類型的緩存在使用過程中的每一步驟的執(zhí)行定義了下面的C語言函數(shù):
//下面的函數(shù)與上面的7個(gè)步驟一一對應(yīng)
glGenBuffers();
glBindBuffer();
glBufferData()或者glBufferSubData();
glEnableVertexAttribArray()或者glDisableVertexAttribArray();
glVertexAttribPointer();
glDrawArrays()或者glDrawElements();
glDeleteBuffers();
幀緩存:

GPU需要知道應(yīng)該在內(nèi)存的哪個(gè)位置存儲渲染出來的2D圖像像素?cái)?shù)據(jù)。就像為GPU提供數(shù)據(jù)的緩存一樣,接受渲染結(jié)果的緩沖區(qū)叫做幀緩存(frame buffer)。程序會像任何其他種類的緩存一樣生成、綁定、刪除幀緩存。但是幀緩存不需要初始化,因?yàn)殇秩局噶顣谶m當(dāng)?shù)臅r(shí)候替換緩存的內(nèi)容。鎮(zhèn)緩存會在被綁定的時(shí)候隱式開啟,同時(shí)OpenGL ES會自動的根據(jù)特定平臺的硬件配置和功能來設(shè)置數(shù)據(jù)的類型和偏移。
可以同時(shí)存在很多禎緩存,并且可以通過OpenGL ES讓GPU把渲染結(jié)果存儲到任意數(shù)量的鎮(zhèn)緩存中。但是,屏幕顯示像素要受到保存在前幀緩存(front frame buffer)的特定幀緩存中的像素顏色元素的控制。而程序和操作系統(tǒng)很少會直接渲染到前幀緩存中,因?yàn)槟菢訒層脩艨吹秸阡秩局械倪€沒有渲染完的圖像。相反,程序和操作系統(tǒng)會把渲染結(jié)果保存到包括后幀緩存(back frame buffer)在內(nèi)的其他幀緩存中。當(dāng)渲染后的后幀緩存包含一個(gè)完成的圖像時(shí),前幀緩存與后幀緩存幾乎會瞬間切換。后幀緩存,會變成新的前幀緩存,同時(shí)舊的前幀緩存會變成后幀緩存。圖1-1展示了屏幕顯示像素、前幀緩存及后幀緩存三者之間的關(guān)系。


圖 1-1.png
OpenGL ES的上下文:

用于配置OpenGL ES的保存在特定平臺的軟件數(shù)據(jù)結(jié)構(gòu)中的信息會被封裝到一個(gè)OpenGL ES上下文中(context)中。上下文中的信息可能會被保存在CPU所控制的內(nèi)存中,也可能保存在GPU所控制的內(nèi)存中。OpenGL ES會按需在兩個(gè)內(nèi)存區(qū)域之間復(fù)制信息,知道何時(shí)發(fā)生復(fù)制有助于程序的優(yōu)化。在后面的文章會專門介紹內(nèi)存優(yōu)化技術(shù)。
OpenGL ES上下文會跟蹤用于渲染的幀緩存。上下文還會跟蹤用于幾何數(shù)據(jù)、顏色等的緩存。上下文決定是否使用某些功能,比如紋理和燈光,上下文還會為渲染定義當(dāng)前的坐標(biāo)系統(tǒng)。

坐標(biāo)系:

坐標(biāo)系是用于幫助顯示空間中的位置之間的關(guān)系的參考線的集合。OpenGL ES總是開始于一個(gè)矩形的笛卡兒坐標(biāo)系,這意味著任何兩個(gè)軸之間的角度都是90度,空間中的每一個(gè)位置被稱為一個(gè)頂點(diǎn),每個(gè)頂點(diǎn)通過其在X、Y、Z軸上的位置定義。圖1-2 定義了OpenGL ES的坐標(biāo)系。


圖1-2 迪卡兒坐標(biāo)系.png
矢量:

矢量是既有方向又有距離的一個(gè)量。所有的頂點(diǎn)都可以用它相對于OpenGL ES坐標(biāo)系原點(diǎn)({0,0,0})的距離和方向來定義。可以使用每個(gè)頂點(diǎn)的坐標(biāo)之間的差異來計(jì)算任意兩個(gè)頂點(diǎn)之間的矢量。介于頂點(diǎn){1.5,3.0,-2.0}與原點(diǎn)之間的矢量是{1.5-0.0,3.0-0.0,-2.0-0.0}。頂點(diǎn)V1與頂點(diǎn)V2之間的矢量等于{V2.x-V1.x,V2.y-V1.y,V2.z-V1.z}。矢量可以加在一起進(jìn)而產(chǎn)生一個(gè)新矢量。介于原點(diǎn)與任意頂點(diǎn)之間的矢量是3個(gè)軸對齊矢量的和。
矢量是理解現(xiàn)代GPU的關(guān)鍵,因?yàn)閳D形處理器就是大規(guī)模并行矢量處理器。GPU能夠同時(shí)控制多個(gè)矢量,并執(zhí)行用于定義渲染結(jié)果的矢量運(yùn)算。

點(diǎn)、線、三角形:

OpenGL ES使用頂點(diǎn)數(shù)據(jù)來定義點(diǎn)、線段和三角形。一個(gè)頂點(diǎn)會定義坐標(biāo)系中的一個(gè)點(diǎn)的位置,兩個(gè)頂點(diǎn)會定義一個(gè)線段,三個(gè)頂點(diǎn)會定義一個(gè)三角形。OpenGL ES只渲染頂點(diǎn)、線段和三角形。圖1-3 顯示了使用很多三角形建立起來的幾何對象有多復(fù)雜。


圖1-3 渲染為頂點(diǎn)、三角形、線段的頂點(diǎn)數(shù)據(jù).png

結(jié)語:

本篇為OpenGL ES系列第一篇,主要講解了一些相關(guān)的基本概念,屬于入門篇,先對OpenGL ES有個(gè)初步的印象。
未完待續(xù)...

路漫漫其修遠(yuǎn)兮,吾將上下而求索。

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

推薦閱讀更多精彩內(nèi)容