? ? ? ? 前言: OpenGL ES(OpenGL for Embeded System)是以手持和嵌入式為目標的高級3D圖形應用程序編程接口(API),OpenGL ES目前在手機中占據統治地位的圖形API,支持的平臺有iOS,Andriod,BlackBerry,bada,Linux,Windows。?
一、了解OpenGL ES
? ? OpenGL ES開放式圖形庫(OpenGL的)用于可視化的二維和三維數據。它是一個多功能開放標準圖形庫,支持2D和3D數字內容創建,機械和建筑設計,虛擬原型設計,飛行模擬,視頻游戲等應用程序。您可以使用OpenGL配置3D圖形管道并向其提交數據,頂點變換和變量,組合成圖元,并光柵化以創建2D圖像。OpenGL旨在將函數調用轉化為可以發送到底層圖形硬件的圖形命令。由于底層硬件專用于處理圖形命令,因此OpenGL繪圖通常非常快。
? ? ? OpenGL ES是OpenGL的簡化版本,它消除了冗余功能,提供了一個既容易學習又更易于在移動圖形硬件中實現的庫。
? ? ? OpenGL ES允許應用程序利用底層圖形處理器的強大功能。iOS設備上的CPU可以執行復雜的2D和3D圖形繪圖,以及最終圖像中每個像素的復雜著色計算。
二、OpenGL ES 圖形管道
1、頂點著色輸入
? ? ? ? ——可以用于執行自定義計算,實施新的變換、照明或者傳統的固定功能所不允許的基于頂點的效果。
①、著色器程序——描述頂點上執行操作的頂點著色器程序源代碼/可執行文件。
②、頂點著色器輸入【屬性】——用頂點數組提供每一個頂點的數據。
③、統一變量【uniform】——頂點、片元著色器使用的不變的數據。
④、采樣器——代表頂點著色器使用紋理的特殊統一變量類型。
2、頂點著色器業務
①、矩陣變換位置
②、計算光照公式生成逐頂點顏色
③、生成/變紋理坐標
頂點著色器代碼案例
attribute vec4 position;//屬性 紋理頂點
attribute vec2 textCoordinate; //紋理坐標
uniform mat4 rotateMatrix; //uniform旋轉矩陣
varying lowp vec2 varyTextCoord;
void main() {
? ? varyTextCoord = textCoordinate;
? ? vec4 vPos = position;
? ? vPos = vPos * rotateMatrix;
? ? gl_Position = vPos;
}
3、圖元裝配
頂點著色器之后,下一個階段就是圖元裝配。
OpenGL ES只有三種圖元(Primitive):點、線、三角形。
圖元裝配:就是將頂點數據計算成一個個的圖元,在這個階段會執行裁剪,透視分割和ViewPort視口變換操作。
圖元類型和頂點確定將被渲染的單獨圖元。對于每個單獨的圖元及其對應的頂點,圖元裝配階段執行的操作包括:將頂點著色器的輸出值執行裁剪、透視分割、視口變換,之后進入光柵化階段。
4、光柵化階段
在這個階段繪制對應的圖元【點、線、三角形】。光柵化就是將圖元轉化成一個二維片段的過程,而這些轉化的片段將由片元著色器處理,這些二維片段就是屏幕上可繪制的像素。
5、片元/像素著色器
①、著色器程序——描述片段上執行操作的頂點著色器程序源代碼/可執行文件
②、輸入變量——光柵化單元用插值為每個片段生成的頂點著色器輸出。
③、統一變量【uniform】——頂點/片元著色器使用的不變數據。
④、采樣器——代表片元著色器使用紋理的特殊統一變量類型。
6、片元著色器業務:
——它可以用于圖片/視頻/圖形中每一個像素的顏色填充,【比如給視頻添加濾鏡,實質上就是將視頻中每個圖片的像素點的顏色填充進行修改】
①、計算顏色
②、獲取紋理值
③、往像素點中填充顏色值【紋理/顏色值】
片元著色器代碼案例:
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main(){
? ? gl_FragColor = texture2D(colorMap, varyTextCoord);
}
7、逐片段操作:
①、像素歸屬測試:
? ? 確定幀緩存區中位置(Xw,Yw)的像素,目前是不是歸屬于OpenGL ES所 有. 例如,如果?個顯示OpenGL ES幀緩存區View被另外?個View 所遮蔽.則窗?系統可以確定被遮蔽的像素不屬于OpenGL ES上下?.從?不全顯示這些像素.?像素歸 屬測試是OpenGL ES 的?部分,它不由開發者?為控制,?是由OpenGL ES 內部進?.
②、裁剪測試:
? ? 裁剪測試會確定(Xw,Yw)是否位于作為OpenGL ES狀態的?部分裁剪矩形范圍 內.如果該?段位于裁剪區域之外,則被拋棄
③、深度測試:
? ? 輸??段的深度值進行?較,確定?段是否拒絕測試 。
④、混合:
? ? 混合將新?成的?段顏?與保存在幀緩存的位置的顏?色值組合起來。
⑤、 抖動:
? ? 抖動可?于最?化因為使?有限精度在幀緩存區中保存顏?色值?產?的偽像。
[溪浣雙鯉的技術摸爬滾打之路](http://www.lxweimin.com/p/3fbecd65faae)