OpenGLES-理論準備
GitHub地址
https://github.com/softwarefaith/OpenGLES-Guide/tree/master
基礎(chǔ)概念
- GPU
圖形處理單元,結(jié)合幾何,顏色,燈光和其他數(shù)據(jù)產(chǎn)生屏幕硬件組件
- 渲染
用3D數(shù)據(jù)生成一個2D圖像的過程
- 像素
一張圖片由矩形的顏色點組成,這些顏色點為像素弟头。
圖像由像素構(gòu)成,每個像素有紅,藍捆姜,綠 3個元素
OpenGL ES
什么是OpenGL-ES
OpenGL是一套應用程序編程接口(API),借助這個API我們開發(fā)人員就可以開發(fā)出對圖形硬件具有訪問的能力的程序迎膜。OpenGL ES是OpenGL的剪裁版本.
特性
- 過程性
OpenGL不是面向?qū)ο蟮哪嗉迹設(shè)penGL無法利用面向?qū)ο蟮奶匦?/p>
- 雙重實現(xiàn)
1軟件
2硬件
與硬件關(guān)系
部分運行在CPU,部分運行在GPU上磕仅,橫跨兩個處理器之間珊豹,協(xié)調(diào)兩個內(nèi)存區(qū)域的數(shù)據(jù)交換簸呈。
OpenGL的組成
圖元函數(shù):指定要生成圖形或圖像的圖元。主要有兩種類型店茶,一種是繪制二維或三維的幾何圖元蜕便,如點,線贩幻,多邊形等轿腺;另一種是離散型的實體,例如:位圖丛楚。
屬性函數(shù):屬性函數(shù)主要是控制圖元的外觀及樣式族壳,例如:對圖元的顏色、線型趣些、光照及紋理等效果處理仿荆。
觀察函數(shù):觀察函數(shù)主要是對攝像機屬性的操作。我們可以操作攝像機顯示圖形或圖像近距或是遠距效果坏平。
控制函數(shù):能夠讓我們啟用或禁用各種OpenGL的特性拢操。
查詢函數(shù):可以讓我們查詢OpenGL狀態(tài)變量的值。
輸入與窗口控制函數(shù):這個本身不屬于OpenGL舶替,但是由于我們會經(jīng)常在程序中輸入輸出或是窗口控制操作令境,所以,這些函數(shù)還是比較重要的坎穿。
在iOS中需要類庫:
開發(fā)約定
我們以后會見到OpenGL的函數(shù)多是以gl開頭展父,因為OpenGL的函數(shù)遵循一定的命名約定,它可以告訴我們這個函數(shù)來自哪個函數(shù)庫玲昧,并且還可以告訴我們這個函數(shù)的參數(shù)個數(shù)和類型栖茉。
OpenGL的函數(shù)是采用以下的書寫格式:
<函數(shù)庫前綴><根命令><可選的參數(shù)數(shù)量><可選的參數(shù)類型>
坐標系與變換
在開發(fā)OpenGL程序時,需要用到兩個坐標系孵延。一個稱為對象坐標系吕漂,另一個稱為世界坐標系。
第一個坐標系是我們在開發(fā)中使用的坐標系尘应;第二個坐標系又稱為窗口坐標系或屏幕坐標系惶凝,在這個坐標系中的單位是像素。
在繪制的過程中犬钢,OpenGL會自動實現(xiàn)從對象到窗口坐標系的轉(zhuǎn)換苍鲜,所需要的信息是屏幕中顯示窗口的尺寸和用戶希望顯示對象空間的大小。OpenGL中所需要的坐標系變換由兩個矩陣決定玷犹,即模型視圖矩陣和投影矩陣混滔,這些矩陣是OpenGL的狀態(tài)的一部分。設(shè)置這兩種矩陣的典型步驟包括以下三個步驟:
(1) 指定我們希望修改的矩陣。
(2) 將矩陣設(shè)為單位矩陣坯屿。
(3) 修改當前矩陣為用戶期望的矩陣油湖。
</br>
<code>
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluortho2D(-1.0,1.0,-1.0,1.0)
</code>
狀態(tài)保存
OpenGL在內(nèi)部就是一個狀態(tài)機,函數(shù)調(diào)用會修改其內(nèi)部的狀態(tài)领跛,OpenGL的狀態(tài)決定了圖元的行為和繪制方式乏德。我們對圖元的屬性和其他狀態(tài)變量所進行的全部修改。在OpenGL中提供了兩種類型的堆棧吠昭,可將當前狀態(tài)保存在堆棧中喊括,以便以后使用。
矩陣堆椩踅耄可用于保存投影矩陣和模型視圖矩陣瘾晃。每種類型的堆棧只能用來容納相應類型的矩陣贷痪。所使用的矩陣由當前矩陣模式(GL_MODELVIEW或GL_PROJECTION)所決定的幻妓。可用函數(shù)glPushMatrix()和glPopMatrix()使矩陣入椊俾#或出棧肉津。
矩陣堆棧的主要作用:一是在構(gòu)建層次模型時,使用堆棧來遍歷這些層次模型的樹型數(shù)據(jù)結(jié)構(gòu)舱沧;二是在進行繪制時可以回到先前的視圖妹沙,而不需要我們重新計算繪制。
緩存
圖形處理器能夠控制和管理的連續(xù)RAM.目的是在兩個內(nèi)存區(qū)域間數(shù)據(jù)交換時熟吏,更加快速距糖。
OPenGL提供了以下七個步驟:
1.生成Generate:緩存標示符∏K拢【glGenBuffers()】
2.綁定(Bind):接下來的運算使用緩存悍引。【glBindBuffers()】
3.緩存數(shù)據(jù)(Buffer Data):為當前綁定的緩存分配并初始化足夠的連續(xù)內(nèi)存帽氓∪そ铮【glBufferData() / glBuferSubData()】
4.啟用(Enable)| 禁止(Disable): 是否使用緩存數(shù)據(jù)。 【glEnableVertexAttribArray()/glDisableVertexAttribArray()】
5.設(shè)置指針(set Pointers): 數(shù)據(jù)類型以及數(shù)據(jù)內(nèi)存偏移值黎休∨欤【glVertexAttribPointer()】
6.繪圖(Draw):使用綁定的緩存數(shù)據(jù)渲染場景∈迫【glDrawArrays()/glDrawElements()】
7.刪除(Delete):刪除以前生成的緩存并釋放相關(guān)資源.【glDeleteBuffers()】
幀緩存(FrameBuffer)
接收渲染結(jié)果的緩沖區(qū)叫幀緩存联贩。它不需要被初始化,因為他會在適當?shù)臅r候替換緩存的內(nèi)容捎拯。綁定時泪幌,隱式開啟。
屏幕顯示像素受到保存在前幀緩存的特定緩存中像素顏色元素控制,而程序和操作系統(tǒng)會把渲染結(jié)果保存到包括后幀緩存在內(nèi)的其他幀緩存座菠。
當渲染后的后幀緩存包含一個完成的圖像時狸眼,前幀緩存與后幀緩存幾乎會瞬間切換。后幀緩存會變成新的前幀緩存浴滴,同時舊的前幀緩存會變成后幀緩存拓萌。