1、OpenGLES初探之OpenGL ES/OpenGL ES圖形管線解析


? ? ? ? 前言: 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ù)雜著色計算。

圖1、OpenGL ES的作用

二、OpenGL ES 圖形管道


圖2、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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容