前言:
這篇文章是作者iOS開發(fā)之OpenGL ES系列文章的第一篇,作者也是在不斷地學(xué)習(xí)中,后期會陸續(xù)的循序漸進(jìn)的推出系列文章,希望有志學(xué)習(xí)OPenGL ES的同學(xué)和篇主一起進(jìn)步哦。
注:(如果你覺得我的文章有所幫助,點個喜歡或關(guān)注。您的每一份鼓勵都是我前進(jìn)的動力??)
正文:
OpenGL ES:是蘋果iOS設(shè)備上的用戶界面和圖形揮之能力的基礎(chǔ)。“ES”代表嵌入式系統(tǒng)(Embeded System)。
在進(jìn)入正題之前,先介紹幾個基本的概念:
3D渲染:
圖形處理單元(GPU)就是能夠結(jié)合幾何、顏色、燈光和其他數(shù)據(jù)而產(chǎn)生一個屏幕圖像的硬件組件。屏幕只有2維,因此顯示3D數(shù)據(jù)的技巧就在于產(chǎn)生能夠迷惑眼睛使其看到丟失的第三維的一個圖像。用3D數(shù)據(jù)生成一個2D圖像的過程就叫做渲染。在計算機(jī)上顯示的圖片是由矩形的顏色點組成的,這些矩形的顏色點叫做像素。如果通過放大鏡仔細(xì)觀察顯示器,你會發(fā)現(xiàn)每個像素都是由紅、綠、藍(lán)3個元素組成的。
為圖形處理器提供數(shù)據(jù):
程序會保存3D場景數(shù)據(jù)到硬件隨機(jī)存儲器在(RAM)中。嵌入式中央處理單元有專門為其分配的RAM。
OpenGL ES是一種軟件技術(shù)。OpenGL ES部分運行在CPU上,部分運行在GPU上。OPenGL ES橫跨在兩個處理器之間,協(xié)調(diào)兩個內(nèi)存區(qū)域之間的數(shù)據(jù)交換。
緩存,提供數(shù)據(jù)的最好方式。OpenGL ES為兩個內(nèi)存區(qū)域間的數(shù)據(jù)交換定義了緩存的概念。緩存的概念是指GPU圖形處理器能夠控制和管理的連續(xù)的RAM。通過控制獨立的緩存,GPU就能盡可能以最有效的方式讀寫內(nèi)存。圖形處理器把它處理大量數(shù)據(jù)的能力異步同時地應(yīng)用到緩存上,這意味著在GPU使用緩存中的數(shù)據(jù)工作的同時,運行在CPU上的程序可以繼續(xù)執(zhí)行。
幾乎所有程序提供給GPU的數(shù)據(jù)都應(yīng)該放入緩存中。緩存存儲的到底是幾何數(shù)據(jù)、顏色,燈光效果,還是其他的信息并不重要。為緩存提供數(shù)據(jù)有以下7個步驟:
- 生成(Generate)-請求OpenGL ES為圖形處理器控制的緩存生成一個人獨一無二的額標(biāo)識符。
- 綁定(Bind)-告訴OPenGL ES為接下來的運算使用一個緩存。
- 緩存數(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ù)渲染整個場景或者某個場景中的一部分。
- 刪除(Delete)-告訴OpenGL ES刪除以前生成的緩存并釋放相關(guān)的資源。
OpenGL ES為一種類型的緩存在使用過程中的每一步驟的執(zhí)行定義了下面的C語言函數(shù):
//下面的函數(shù)與上面的7個步驟一一對應(yīng)
glGenBuffers();
glBindBuffer();
glBufferData()或者glBufferSubData();
glEnableVertexAttribArray()或者glDisableVertexAttribArray();
glVertexAttribPointer();
glDrawArrays()或者glDrawElements();
glDeleteBuffers();
幀緩存:
GPU需要知道應(yīng)該在內(nèi)存的哪個位置存儲渲染出來的2D圖像像素數(shù)據(jù)。就像為GPU提供數(shù)據(jù)的緩存一樣,接受渲染結(jié)果的緩沖區(qū)叫做幀緩存(frame buffer)。程序會像任何其他種類的緩存一樣生成、綁定、刪除幀緩存。但是幀緩存不需要初始化,因為渲染指令會在適當(dāng)?shù)臅r候替換緩存的內(nèi)容。鎮(zhèn)緩存會在被綁定的時候隱式開啟,同時OpenGL ES會自動的根據(jù)特定平臺的硬件配置和功能來設(shè)置數(shù)據(jù)的類型和偏移。
可以同時存在很多禎緩存,并且可以通過OpenGL ES讓GPU把渲染結(jié)果存儲到任意數(shù)量的鎮(zhèn)緩存中。但是,屏幕顯示像素要受到保存在前幀緩存(front frame buffer)的特定幀緩存中的像素顏色元素的控制。而程序和操作系統(tǒng)很少會直接渲染到前幀緩存中,因為那樣會讓用戶看到正在渲染中的還沒有渲染完的圖像。相反,程序和操作系統(tǒng)會把渲染結(jié)果保存到包括后幀緩存(back frame buffer)在內(nèi)的其他幀緩存中。當(dāng)渲染后的后幀緩存包含一個完成的圖像時,前幀緩存與后幀緩存幾乎會瞬間切換。后幀緩存,會變成新的前幀緩存,同時舊的前幀緩存會變成后幀緩存。圖1-1展示了屏幕顯示像素、前幀緩存及后幀緩存三者之間的關(guān)系。
OpenGL ES的上下文:
用于配置OpenGL ES的保存在特定平臺的軟件數(shù)據(jù)結(jié)構(gòu)中的信息會被封裝到一個OpenGL ES上下文中(context)中。上下文中的信息可能會被保存在CPU所控制的內(nèi)存中,也可能保存在GPU所控制的內(nèi)存中。OpenGL ES會按需在兩個內(nèi)存區(qū)域之間復(fù)制信息,知道何時發(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總是開始于一個矩形的笛卡兒坐標(biāo)系,這意味著任何兩個軸之間的角度都是90度,空間中的每一個位置被稱為一個頂點,每個頂點通過其在X、Y、Z軸上的位置定義。圖1-2 定義了OpenGL ES的坐標(biāo)系。
矢量:
矢量是既有方向又有距離的一個量。所有的頂點都可以用它相對于OpenGL ES坐標(biāo)系原點({0,0,0})的距離和方向來定義。可以使用每個頂點的坐標(biāo)之間的差異來計算任意兩個頂點之間的矢量。介于頂點{1.5,3.0,-2.0}與原點之間的矢量是{1.5-0.0,3.0-0.0,-2.0-0.0}。頂點V1與頂點V2之間的矢量等于{V2.x-V1.x,V2.y-V1.y,V2.z-V1.z}。矢量可以加在一起進(jìn)而產(chǎn)生一個新矢量。介于原點與任意頂點之間的矢量是3個軸對齊矢量的和。
矢量是理解現(xiàn)代GPU的關(guān)鍵,因為圖形處理器就是大規(guī)模并行矢量處理器。GPU能夠同時控制多個矢量,并執(zhí)行用于定義渲染結(jié)果的矢量運算。
點、線、三角形:
OpenGL ES使用頂點數(shù)據(jù)來定義點、線段和三角形。一個頂點會定義坐標(biāo)系中的一個點的位置,兩個頂點會定義一個線段,三個頂點會定義一個三角形。OpenGL ES只渲染頂點、線段和三角形。圖1-3 顯示了使用很多三角形建立起來的幾何對象有多復(fù)雜。
結(jié)語:
本篇為OpenGL ES系列第一篇,主要講解了一些相關(guān)的基本概念,屬于入門篇,先對OpenGL ES有個初步的印象。
未完待續(xù)...
路漫漫其修遠(yuǎn)兮,吾將上下而求索。