一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

OpenGL ES 2.0渲染管線 | Alex Zhou的BLOG

 昵稱3554661 2015-07-01

Opengl es 2.0實現(xiàn)了可編程的圖形管線,比起1.x的固定管線要復雜和靈活很多,由兩部分規(guī)范組成:Opengl es 2.0 API規(guī)范和Opengl es著色語言規(guī)范。下圖是Opengl es 2.0渲染管線,陰影部分是opengl es 2.0的可編程階段。

 

1. 頂點著色器(VertexShader)
頂點著色器對頂點實現(xiàn)了一種通用的可編程方法。
頂點著色器的輸入數(shù)據(jù)由下面組成:
Attributes:使用頂點數(shù)組封裝每個頂點的數(shù)據(jù),一般用于每個頂點都各不相同的變量,如頂點位置、顏色等。
Uniforms:頂點著色器使用的常量數(shù)據(jù),不能被著色器修改,一般用于對同一組頂點組成的單個3D物體中所有頂點都相同的變量,如當前光源的位置。
Samplers:這個是可選的,一種特殊的uniforms,表示頂點著色器使用的紋理。
Shader program:頂點著色器的源碼或可執(zhí)行文件,描述了將對頂點執(zhí)行的操作。
頂點著色器的輸出數(shù)據(jù)是varying變量,在圖元光柵化階段,這些varying值為每個生成的片元進行計算,并將結果作為片元著色器的輸入數(shù)據(jù)。從分配給每個頂點的原始varying值來為每個片元生成一個varying值的機制叫做插值。
頂點著色器數(shù)據(jù)的輸入和輸出可以參考下圖:
頂點著色器可用于傳統(tǒng)的基于頂點的操作,例如:基于矩陣變換位置,進行光照計算來生成每個頂點的顏色,生成或者變換紋理坐標。
另外因為頂點著色器是由應用程序指定的,所以你可以用來進行任意自定義的頂點變換。

下面是一個用opengl es著色器語言編寫的頂點著色器源碼,這個頂點著色器使用一個position和跟它相關聯(lián)的color數(shù)據(jù)作為輸入數(shù)據(jù),通過一個4×4矩陣變換位置,然后輸出變換后的位置和顏色數(shù)據(jù)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. // uniforms used by the vertex shader
2. uniform mat4 u_mvpMatrix; // matrix to convert P from model
3. // space to normalized device space.
4.
5. // attributes input to the vertex shader
6. attribute vec4 a_position; // position value
7. attribute vec4 a_color; // input vertex color
8.
9. // varying variables – input to the fragment shader
10. varying vec4 v_color; // output vertex color
11.
12. void
13. main()
14. {
15. v_color = a_color;
16. gl_Position = u_mvpMatrix * a_position;
17. }

第2行代碼定義了一個uniform變量u_mvpMatrix,mat4表示4×4浮點數(shù)矩陣,該變量存儲了組合模型視圖和投影矩陣。6和7行代碼定義了頂點著色器的輸入數(shù)據(jù):Attributes,vec4表示包含了4個浮點數(shù)的向量,a_position是頂點位置屬性,a_color是頂點顏色屬性。第10行代碼定義了varying類型的變量v_color,varying是用于從頂點著色器傳遞到片元著色器的變量,v_color是頂點著色器的輸出數(shù)據(jù),存儲了每個頂點的顏色。12-17行的main函數(shù)是頂點著色器和片元著色器的入口,第15行讀取了頂點著色器輸入屬性中a_color的值,并把它賦值給輸出數(shù)據(jù)v_color,第16行的gl_Position 是內(nèi)置的varying變量,不需要聲明,頂點著色器必須把變換后的位置賦值給它。

2.圖元裝配(Primitive Assembly)
頂點著色器之后,渲染流水線的下一個階段是圖元裝配,圖元是一個能用opengl es繪圖命令繪制的幾何體,繪圖命令指定了一組頂點屬性,描述了圖元的幾何形狀和圖元類型。頂點著色器使用這些頂點屬性計算頂點的位置、顏色以及紋理坐標,這樣才能傳到片元著色器。在圖元裝配階段,這些著色器處理過的頂點被組裝到一個個獨立的幾何圖元中,例如三角形、線、點精靈。對于每個圖元,必須確定它是否位于視椎體內(nèi)(3維空間顯示在屏幕上的可見區(qū)域),如果圖元部分在視椎體中,需要進行裁剪,如果圖元全部在視椎體外,則直接丟棄圖元。裁剪之后,頂點位置轉換成了屏幕坐標。背面剔除操作也會執(zhí)行,它根據(jù)圖元是正面還是背面,如果是背面則丟棄該圖元。經(jīng)過裁剪和背面剔除操作后,就進入渲染流水線的下一個階段:光柵化。

3. 光柵化(Rasterization)
光柵化階段把圖元轉換成片元集合,之后會提交給片元著色器處理,這些片元集合表示可以被繪制到屏幕的像素。如下圖所示:

 

4. 片元著色器(FragmentShader)
片元著色器對片元實現(xiàn)了一種通用的可編程方法,它對光柵化階段產(chǎn)生的每個片元進行操作,需要的輸入數(shù)據(jù)如下:
Varying variables:頂點著色器輸出的varying變量經(jīng)過光柵化插值計算后產(chǎn)生的作用于每個片元的值。
Uniforms:片元著色器使用的常量數(shù)據(jù)
Samplers:一種特殊的uniforms,表示片元著色器使用的紋理。
Shader program:片元著色器的源碼或可執(zhí)行文件,描述了將對片元執(zhí)行的操作。
片元著色器也可以丟棄片元或者為片元生成一個顏色值,保存到內(nèi)置變量gl_FragColor。光柵化階段產(chǎn)生的顏色、深度、模板和屏幕坐標(Xw, Yw)成為流水線中pre-fragment階段(FragmentShader之后)的輸入。如下圖:

下面是一個簡單的片元著色器源碼,可以跟上面的頂點著色器源碼結合繪制一個高洛德著色的三角形。

1
2
3
4
5
6
7
8
9
10
1. precision mediump float;
2.
3. varying vec4 v_color; // input vertex color from vertex shader
4.
5.
6. void
7. main(void)
8. {
9. gl_FragColor = v_color;
10.}

第1行代碼設置默認的精度修飾符,有highp、mediump、lowp,這個后面再詳細解釋。第3行代碼定義了片元著色器的輸入數(shù)據(jù),頂點著色器必須賦值給片元著色器一組一樣的varying變量。注意:gl_FragColor是片元著色器唯一的輸出,第9行代碼把輸入數(shù)據(jù)v_color賦值給gl_FragColor。

5. 逐個片元操作階段(Per-Fragment Operations)
片元著色器之后就是逐個片元操作階段,包括一系列的測試階段。一個光柵化階段產(chǎn)生的具有屏幕坐標(Xw, Yw)的片元,只能修改framebuffer(幀緩沖)中位置在(Xw, Yw)的像素。下圖是Opengl es 2.0逐片元操作的過程:

Pixel ownership test:像素所有權測試決定framebuffer中某一個(Xw, Yw)位置的像素是否屬于當前Opengl ES的context,比如:如果一個Opengl ES幀緩沖窗口被其他窗口遮住了,窗口系統(tǒng)將決定被遮住的像素不屬于當前Opengl ES的context,因此也就不會被顯示。
Scissor test:裁剪測試決定位置為(Xw, Yw)的片元是否位于裁剪矩形內(nèi),如果不在,則被丟棄。
Stencil and depth tests:模板和深度測試傳入片元的模板和深度值,決定是否丟棄片元。
Blending:將新產(chǎn)生的片元顏色值和framebuffer中某個(Xw, Yw)位置存儲的顏色值進行混合。
Dithering:抖動可以用來最大限度的減少使用有限精度存儲顏色值到framebuffer的工件。
逐片元操作之后,片元要么被丟棄,要么一個片元的顏色,深度或者模板值被寫入到framebuffer的(Xw, Yw)位置,不過是否真的會寫入還得依賴于write masks啟用與否。write masks能更好的控制顏色、深度和模板值寫入到合適的緩沖區(qū)。例如:顏色緩沖區(qū)中的write mask可以被設置成沒有紅色值寫入到顏色緩沖區(qū)。另外,Opengl ES 2.0提供從framebuffer中獲取像素的接口,不過需要記住的是像素只能從顏色緩沖區(qū)讀回,深度和模板值不能讀回。

注意:Opengl ES 2.0 的Per-Fragment Operations已經(jīng)不再支持Alpha test 和 LogicOp了,這兩個步驟在 OpenGL 2.0 和 OpenGL ES 1.x中是存在的。Alpha test 階段不再需要的原因是片元著色器可以丟棄片元,所以可以在片元著色器中執(zhí)行Alpha test。 LogicOp因為很少使用,所以不再支持了。

版權屬于: Alex Zhou的BLOG

原文地址: http:///opengles/1504.html

轉載時必須以鏈接形式注明原始出處及本聲明。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产精品日韩欧美一区二区| 日韩日韩日韩日韩在线| 日韩中文字幕欧美亚洲| 日韩中文无线码在线视频| 欧美精品激情视频一区| 久久热这里只有精品视频| 欧美乱妇日本乱码特黄大片| 日韩国产欧美中文字幕| 日本不卡一本二本三区| 伊人网免费在线观看高清版 | 开心久久综合激情五月天| 99精品国产自在现线观看| 免费午夜福利不卡片在线 视频| 香蕉久久夜色精品国产尤物| 99久久免费中文字幕| 久久香蕉综合网精品视频| 国产高清视频一区不卡| 99久久免费中文字幕| 精品少妇人妻av一区二区蜜桃| 日韩中文字幕视频在线高清版| 免费午夜福利不卡片在线 视频| 美日韩一区二区精品系列| 国产一级精品色特级色国产| 欧美日韩久久精品一区二区| 日韩黄片大全免费在线看| 免费国产成人性生活生活片| 麻豆果冻传媒一二三区| 日韩精品在线观看完整版| 亚洲成人久久精品国产| 久久综合狠狠综合久久综合| 欧美又大又黄刺激视频| 免费特黄一级一区二区三区| 国产人妻精品区一区二区三区 | 亚洲视频在线观看你懂的| 99一级特黄色性生活片| 三级理论午夜福利在线看| 日韩三级黄色大片免费观看| 91插插插外国一区二区| 91精品日本在线视频| 日韩欧美综合中文字幕| 日韩成人动画在线观看|