【讀書筆記】OpenGL+ES應(yīng)用開發(fā)實(shí)踐指南:iOS卷

1.圖形處理單元(GPU)就是能夠結(jié)合幾何、顏色、燈管和其他數(shù)據(jù)而產(chǎn)生的一個(gè)屏幕圖像的硬件組件。屏幕只有二維,因此顯示3D數(shù)據(jù)的技巧就在于產(chǎn)生能夠迷惑眼睛使其看到丟失的第3維的一個(gè)圖像。

2.用3D數(shù)據(jù)生成一個(gè)2D的圖像的過程就叫渲染。

3.在計(jì)算機(jī)上顯示的圖片是由矩形的顏色點(diǎn)組成的,這些巨型的顏色點(diǎn)就叫做像素。

4.每個(gè)像素是由3個(gè)顏色元素組成的,即一個(gè)紅點(diǎn)、一個(gè)綠店和一個(gè)藍(lán)點(diǎn)。

5.圖像是以每個(gè)像素至少包含3個(gè)值的一個(gè)數(shù)組存儲在電腦的存儲器中的。第一個(gè)值指定了紅色元素的強(qiáng)度,第二個(gè)值代表綠色強(qiáng)度,第三個(gè)值是藍(lán)色強(qiáng)度。

6.一個(gè)包含10000個(gè)像素的圖像能夠以一個(gè)擁有30000個(gè)強(qiáng)度值的數(shù)組的形式存儲在存儲器中,像素的3個(gè)元素每個(gè)需要一個(gè)值。以不同的強(qiáng)度結(jié)合紅綠藍(lán)3個(gè)值就足以產(chǎn)生彩虹的所有顏色。

7.如果3個(gè)元素的強(qiáng)度都是0,結(jié)果顏色就是黑色。如果3個(gè)元素都是強(qiáng)度的最大值,結(jié)果顏色就是白色,黃色是通過丟掉藍(lán)色并混合紅色和綠色得到的。

8.程序設(shè)計(jì)會(huì)保存3D場景數(shù)據(jù)到硬件隨機(jī)存取存儲器(RAM)中。嵌入式系統(tǒng)的中央處理單元又專門為其分配的RAM。在圖形處理的過程中,GPU也有專門為其分配的RAM。使用現(xiàn)代硬件渲染3D圖形的速度幾乎完全取決于不同的內(nèi)存區(qū)域被訪問的方式。

9.OpenGLES是一種軟件技術(shù)。OpenGL ES部分運(yùn)行在CPU上,部分運(yùn)行在GPU上。OpenGL ES橫跨在兩個(gè)處理器之間,協(xié)調(diào)兩個(gè)內(nèi)存區(qū)域之間的數(shù)據(jù)交換

10.OpenGL ES通常會(huì)高效地協(xié)調(diào)數(shù)據(jù)交換,但是程序于OpenGL ES的交互方式會(huì)明顯地增加或者減少所需的數(shù)據(jù)交換的數(shù)量和類型。對于渲染速度,最快的數(shù)據(jù)交換方式是沒有數(shù)據(jù)交換。

首先,從一個(gè)內(nèi)存區(qū)域復(fù)制數(shù)據(jù)到另一個(gè)內(nèi)存區(qū)域是相對較慢的。更糟糕的是,除非非常小心,在內(nèi)存復(fù)制發(fā)生的時(shí)候GPU和CPU都不能把內(nèi)存另作他用。因此內(nèi)存區(qū)域之間的數(shù)據(jù)交換需要盡量避免。

其次,所有的內(nèi)存訪問都是相對較慢的,最新的嵌入式CPU可以很容易地完成大約每秒一億次的運(yùn)算,但是它只能每秒讀寫內(nèi)存200萬次。這意味著,除非CPU能夠在每次從內(nèi)存讀取一塊數(shù)據(jù)后有效地運(yùn)行五個(gè)或者更多個(gè)運(yùn)算,否則處理器的性能就處在次優(yōu)狀態(tài),這種狀態(tài)叫做“數(shù)據(jù)饑餓”。這種情況對于GPU來說更明顯,在理想條件下,GPU能夠每秒執(zhí)行數(shù)億次運(yùn)算,但是卻只能每秒訪問內(nèi)存2億次。GPU幾乎總是受限于內(nèi)存訪問的性能,并且通常需要在每塊數(shù)據(jù)上執(zhí)行10~30次運(yùn)算才不會(huì)影響整體的圖形輸出。

11.緩存——提供數(shù)據(jù)的最好方式

緩存(buffers)是指圖形處理器能夠控制和管理的連續(xù)RAM。

程序從CPU的內(nèi)存復(fù)制數(shù)據(jù)到OpenGL ES的緩存。在GPU取得一個(gè)緩存的所有權(quán)以后,運(yùn)行在CPU中的程序理想情況下將不再接觸這個(gè)緩存。通過控制獨(dú)占的緩存,GPU就能夠盡可能以最有效的方式讀寫內(nèi)存。圖形處理器把它處理大量數(shù)據(jù)的能力異步同時(shí)地應(yīng)用到緩存上,這意味著在GPU使用緩存中的數(shù)據(jù)工作的同時(shí),運(yùn)行在CPU中的程序可以繼續(xù)執(zhí)行。幾乎所有程序提供給GPU的數(shù)據(jù)都應(yīng)放入緩存中。

12.為緩存提供數(shù)據(jù)的步驟及核心函數(shù):

1??生成(Generate):請求O盆GLES為圖形處理器控制的緩存生成一個(gè)獨(dú)一無二的標(biāo)識符;glGenBuffers()

2??綁定(Bind):告訴OpenGL ES為接下來的運(yùn)算使用一個(gè)緩存。glBindBuffer()

3??緩存數(shù)據(jù)(Buffer Data):讓OpenGL ES為當(dāng)前綁定的緩存分配并初始化足夠的連續(xù)內(nèi)存(通常是從CPU控制的內(nèi)存復(fù)制數(shù)據(jù)到分配的內(nèi)存)glBufferData()或者glBufferSubData()

4??啟用或禁止(Enable or Disable):告訴OpenGL ES在接下來的渲染中是否使用緩存中的數(shù)據(jù)。glEnableVertexAttribArray()或者glDisableVertexAttribArray()

5??設(shè)置指針(Set Pointers):告訴OpenGL ES在緩存中的數(shù)據(jù)的類型和所有需要訪問的數(shù)據(jù)的內(nèi)存偏移值。glVertexAttribPointer()

6??繪圖(Draw):告訴OpenGL ES使用當(dāng)前綁定并啟用的緩存中的數(shù)據(jù)渲染整個(gè)場景或者某個(gè)場景的一部分。glDrawArrays()或者glDrawElements()

7??刪除(Delete):告訴OpenGL ES刪除以前生成的緩存并釋放相關(guān)的資源。glDeleteBuffers()

??核心函數(shù):

glGenBuffers()—請OpenGL ES為圖形處理器 制的緩存生成一個(gè)獨(dú)一無

的標(biāo)識符。

glBindBuffer()—告訴OpenGL ES為接下來的運(yùn)算使用一個(gè)緩存。

glBufferData()或者glBufferSubData()—讓OpenGL ES為當(dāng)前 定的緩存分配

并初始化 夠的? 內(nèi)存(通常是從CPU制的內(nèi)存復(fù)制數(shù)據(jù)到分配的內(nèi)存)。

glEnableVertexAttribArray()或者glDisableVertexAttribArray()—告訴OpenGL

ES在接下來的渲染中是 使用緩存中的數(shù)據(jù)。

glVertexAttribPointer()—告訴OpenGL ES在緩存中的數(shù)據(jù)的類型和所有需要的數(shù)據(jù)的內(nèi)存偏移值。

glDrawArrays()或者glDrawElements()—告訴OpenGL ES使用當(dāng)前 定并啟

用的緩存中的數(shù)據(jù)渲染整個(gè)場景或者某個(gè)場景的一部分。

glDeleteBuffers()—告訴OpenGL ES除以前生成的緩存并釋 相關(guān)的資源。

13.理想情況下,每個(gè)生成的緩存都可以使用相當(dāng)長的時(shí)間(可能是程序的整個(gè)生命周期)。生成、初始化和刪除緩存有時(shí)需要耗費(fèi)時(shí)間來同步圖形處理器和CPU。存在這個(gè)延遲是因?yàn)镚PU在刪除一個(gè)緩存之前必須完成所有與該緩存相關(guān)的等待中的運(yùn)算。如果一個(gè)程序每秒生成河刪除緩存數(shù)千次,GPU可能就沒有時(shí)間來完成任何渲染了。

14.GPU需要知道應(yīng)該在內(nèi)存的哪個(gè)位置存儲渲染出來的2D圖像像素?cái)?shù)據(jù)。就像為GPU提供數(shù)據(jù)的緩存一樣,接收渲染結(jié)果的緩沖區(qū)叫做幀緩存(frame buffer)。程序會(huì)像任何其他種類的緩存一樣生成、綁定、刪除幀緩存。但是幀緩存不需要初始化,因?yàn)殇秩局噶顣?huì)在適當(dāng)?shù)臅r(shí)候替換緩存的內(nèi)容。幀緩存會(huì)在被綁定的時(shí)候隱式開啟,同時(shí)OpenGL ES會(huì)自動(dòng)地根據(jù)特定平臺的硬件配置和功能來設(shè)置數(shù)據(jù)的類型和偏移。

15.可以同時(shí)存在很多幀緩存,并且可以通過OpenGL ES讓GPU把渲染結(jié)果存儲到任意數(shù)量的幀緩存中。但是,屏幕顯示像素要受到保存在前幀緩存(front frame buffer)的特定的幀緩存中的像素顏色元素的控制。程序設(shè)計(jì)和操作系統(tǒng)很少會(huì)直接渲染到前幀緩存中,因?yàn)槟菢訒?huì)讓用戶看到正在渲染中的還沒完成渲染的圖像。

16.OpenGL 坐標(biāo)系,OpenGL ES坐標(biāo)是以浮點(diǎn)數(shù)來存儲的。現(xiàn)代GPU對浮點(diǎn)運(yùn)算做了專門的優(yōu)化,即使是使用其他數(shù)據(jù)類型的頂點(diǎn)也會(huì)被轉(zhuǎn)換成浮點(diǎn)值。

17.矢量是理解現(xiàn)代GPU的關(guān)鍵,因?yàn)閳D形處理器就是大規(guī)模并行矢量處理器。GPU能夠同時(shí)控制多個(gè)矢量,并執(zhí)行用于定義渲染結(jié)果的矢量運(yùn)算。

18.GLKViewController類是支持OpenGL ES特有的行為和動(dòng)畫計(jì)時(shí)的UIViewController的內(nèi)建子類。

19.GLKView這是Cocoa Touch UIView類的內(nèi)建子類。GLKView簡化了通過用Core Animation層來自動(dòng)創(chuàng)建并管理 緩存和渲染緩存共 內(nèi)存所需要做的工作。GLKView相關(guān)的GLKViewController實(shí)例是視圖的委 并接 當(dāng)視圖需要重繪時(shí)的消息。創(chuàng)建你自己的UIView或者GLKView的子類來實(shí)現(xiàn)應(yīng)用特有的繪圖是可能的,

20.GLKView和GLKViewController類? 中的GLK類iOS 5引的GLKit架的一部分。框架是指被編譯后的代碼所使用的編譯后的代碼、接口聲明以及類似圖像和數(shù)據(jù)的資源文件的集合。框架高效地組織可重用共享庫,并且在一些情況下可能包含庫的多個(gè)版本。

21.點(diǎn)寬設(shè)置函數(shù)glPointSize(1.0),線寬glLineWidth(1.0)

22.繪制字體,有兩種方法,一是用位圖數(shù)據(jù)進(jìn)行繪制,一種是用幾何圖形(點(diǎn)、直線和多邊形)繪制的字體。

23.字體一般是由一組字符組成,其中每個(gè)字符都有一個(gè)標(biāo)識碼(通常是ASCII碼)和一個(gè)繪制方法。

24.紋理:是用來保存圖像的顏色元素值的OpenGL ES緩存。

25.

26.

27.

28.

29.

30.

-------------------------------------------------------------------

未完待續(xù),持續(xù)更新

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

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