? ? ? ? 前言: OpenGL ES(OpenGL for Embeded System)是以手持和嵌入式為目標(biāo)的高級3D圖形應(yīng)用程序編程接口(API),OpenGL ES目前在手機(jī)中占據(jù)統(tǒng)治地位的圖形API,支持的平臺有iOS,Andriod,BlackBerry,bada,Linux,Windows。?
一、了解OpenGL ES
? ? OpenGL ES開放式圖形庫(OpenGL的)用于可視化的二維和三維數(shù)據(jù)。它是一個多功能開放標(biāo)準(zhǔn)圖形庫,支持2D和3D數(shù)字內(nèi)容創(chuàng)建,機(jī)械和建筑設(shè)計,虛擬原型設(shè)計,飛行模擬,視頻游戲等應(yīng)用程序。您可以使用OpenGL配置3D圖形管道并向其提交數(shù)據(jù),頂點(diǎn)變換和變量,組合成圖元,并光柵化以創(chuàng)建2D圖像。OpenGL旨在將函數(shù)調(diào)用轉(zhuǎn)化為可以發(fā)送到底層圖形硬件的圖形命令。由于底層硬件專用于處理圖形命令,因此OpenGL繪圖通常非???。
? ? ? OpenGL ES是OpenGL的簡化版本,它消除了冗余功能,提供了一個既容易學(xué)習(xí)又更易于在移動圖形硬件中實(shí)現(xiàn)的庫。
? ? ? OpenGL ES允許應(yīng)用程序利用底層圖形處理器的強(qiáng)大功能。iOS設(shè)備上的CPU可以執(zhí)行復(fù)雜的2D和3D圖形繪圖,以及最終圖像中每個像素的復(fù)雜著色計算。

二、OpenGL ES 圖形管道

1、頂點(diǎn)著色輸入
? ? ? ? ——可以用于執(zhí)行自定義計算,實(shí)施新的變換、照明或者傳統(tǒng)的固定功能所不允許的基于頂點(diǎn)的效果。
①、著色器程序——描述頂點(diǎn)上執(zhí)行操作的頂點(diǎn)著色器程序源代碼/可執(zhí)行文件。
②、頂點(diǎn)著色器輸入【屬性】——用頂點(diǎn)數(shù)組提供每一個頂點(diǎn)的數(shù)據(jù)。
③、統(tǒng)一變量【uniform】——頂點(diǎn)、片元著色器使用的不變的數(shù)據(jù)。
④、采樣器——代表頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型。
2、頂點(diǎn)著色器業(yè)務(wù)
①、矩陣變換位置
②、計算光照公式生成逐頂點(diǎn)顏色
③、生成/變紋理坐標(biāo)
頂點(diǎn)著色器代碼案例
attribute vec4 position;//屬性 紋理頂點(diǎn)
attribute vec2 textCoordinate; //紋理坐標(biāo)
uniform mat4 rotateMatrix; //uniform旋轉(zhuǎn)矩陣
varying lowp vec2 varyTextCoord;
void main() {
? ? varyTextCoord = textCoordinate;
? ? vec4 vPos = position;
? ? vPos = vPos * rotateMatrix;
? ? gl_Position = vPos;
}
3、圖元裝配
頂點(diǎn)著色器之后,下一個階段就是圖元裝配。
OpenGL ES只有三種圖元(Primitive):點(diǎn)、線、三角形。
圖元裝配:就是將頂點(diǎn)數(shù)據(jù)計算成一個個的圖元,在這個階段會執(zhí)行裁剪,透視分割和ViewPort視口變換操作。
圖元類型和頂點(diǎn)確定將被渲染的單獨(dú)圖元。對于每個單獨(dú)的圖元及其對應(yīng)的頂點(diǎn),圖元裝配階段執(zhí)行的操作包括:將頂點(diǎn)著色器的輸出值執(zhí)行裁剪、透視分割、視口變換,之后進(jìn)入光柵化階段。
4、光柵化階段
在這個階段繪制對應(yīng)的圖元【點(diǎn)、線、三角形】。光柵化就是將圖元轉(zhuǎn)化成一個二維片段的過程,而這些轉(zhuǎn)化的片段將由片元著色器處理,這些二維片段就是屏幕上可繪制的像素。
5、片元/像素著色器
①、著色器程序——描述片段上執(zhí)行操作的頂點(diǎn)著色器程序源代碼/可執(zhí)行文件
②、輸入變量——光柵化單元用插值為每個片段生成的頂點(diǎn)著色器輸出。
③、統(tǒng)一變量【uniform】——頂點(diǎn)/片元著色器使用的不變數(shù)據(jù)。
④、采樣器——代表片元著色器使用紋理的特殊統(tǒng)一變量類型。
6、片元著色器業(yè)務(wù):
——它可以用于圖片/視頻/圖形中每一個像素的顏色填充,【比如給視頻添加濾鏡,實(shí)質(zhì)上就是將視頻中每個圖片的像素點(diǎn)的顏色填充進(jìn)行修改】
①、計算顏色
②、獲取紋理值
③、往像素點(diǎn)中填充顏色值【紋理/顏色值】
片元著色器代碼案例:
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main(){
? ? gl_FragColor = texture2D(colorMap, varyTextCoord);
}
7、逐片段操作:
①、像素歸屬測試:
? ? 確定幀緩存區(qū)中位置(Xw,Yw)的像素,目前是不是歸屬于OpenGL ES所 有. 例如,如果?個顯示OpenGL ES幀緩存區(qū)View被另外?個View 所遮蔽.則窗?系統(tǒng)可以確定被遮蔽的像素不屬于OpenGL ES上下?.從?不全顯示這些像素.?像素歸 屬測試是OpenGL ES 的?部分,它不由開發(fā)者?為控制,?是由OpenGL ES 內(nèi)部進(jìn)?.
②、裁剪測試:
? ? 裁剪測試會確定(Xw,Yw)是否位于作為OpenGL ES狀態(tài)的?部分裁剪矩形范圍 內(nèi).如果該?段位于裁剪區(qū)域之外,則被拋棄
③、深度測試:
? ? 輸??段的深度值進(jìn)行?較,確定?段是否拒絕測試 。
④、混合:
? ? 混合將新?成的?段顏?與保存在幀緩存的位置的顏?色值組合起來。
⑤、 抖動:
? ? 抖動可?于最?化因為使?有限精度在幀緩存區(qū)中保存顏?色值?產(chǎn)?的偽像。
[溪浣雙鯉的技術(shù)摸爬滾打之路](http://www.itdecent.cn/p/3fbecd65faae)