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

前言:

這篇文章是作者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)系。


圖 1-1.png
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)系。


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

矢量是既有方向又有距離的一個量。所有的頂點都可以用它相對于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ù)雜。


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

結(jié)語:

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,505評論 2 379

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