Kanzi中級1:Shader材質渲染管道原理

渲染管道(Graphics Pipeline)
在 OpenGL ES 1.0 版本中,支持固定管線,而 OpenGL ES 2.0 版本不再支持固定管線,只支持可編程管線。管線(pipeline)也稱渲染管線,因爲 OpenGL ES在渲染處理過程中會順序執行一系列操作,這一系列相關的處理階段就被稱爲OpenGL ES 渲染管線。整個渲染管線如下圖所示:
在這裏插入圖片描述
1.Vertex Array/Buffer objects:頂點數據來源,這時渲染管線的頂點輸入,通常使用 Buffer objects效率更好。

2.Vertex Shader:頂點着色器,通過可編程的方式實現對頂點的操作,如進行座標空間轉換,計算 per-vertex color以及紋理座標;頂點處理所做的工作則是:
(1)頂點變換…根據模型視圖和投影矩陣變換
(2)光照計算 法線變換(法線矩陣 是模型矩陣的左上角3*3的逆矩陣)和法線規格化
(3)紋理座標變換.(紋理矩陣)
(4)材質狀態 紋理座標生成 而最重要的則是變換以及光照. 每個頂點在這個階段分別是單獨處理的.
這個階段所接收到的數據則是每個頂點的屬性特徵,輸出則是變換後的頂點數據

3.Primitive Assembly:圖元裝配,經過着色器處理之後的頂點在圖片裝配階段被裝配爲基本圖元。OpenGL ES 支持三種基本圖元:點,線和三角形,它們是可被 OpenGL ES 渲染的。接着對裝配好的圖元進行裁剪(clip):保留完全在視錐體中的圖元,丟棄完全不在視錐體中的圖元,對一半在一半不在的圖元進行裁剪;接着再對在視錐體中的圖元進行剔除處理(cull):這個過程可編碼來決定是剔除正面,背面還是全部剔除。在經過裁剪和剔除之後,即進入Geometry Shader(如果存在)或者光柵化處理階段。

4.Rasterization:光柵化,光柵化的過程就是對所有的經過Primitive Assembly圖元轉換成屏幕上可以顯示的二維Fragment。在光柵化階段,基本圖元被轉換爲二維的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,顏色,紋理座標等信息,這些值是由圖元的頂點信息進行插值計算得到的。這些片元接着被送到片元着色器中處理。這是從頂點數據到可渲染在顯示設備上的像素的質變過程。

5.Fragment Shader:片元着色器,通過可編程的方式實現對片元的操作。在這一階段它接受光柵化處理之後的fragment,color,深度值,模版值作爲輸入。

6.Per-Fragment Operation:片元集成,在這一階段對片元着色器輸出的每一個片元進行一系列測試與處理,從而決定最終用於渲染的像素。這一系列處理過程如下:
在這裏插入圖片描述
Pixel ownership test:像素測試,該測試決定像素在 framebuffer 中的位置是不是爲當前 OpenGL ES 所有。也就是說測試某個像素是否對用戶可見或者被重疊窗口所阻擋;For an application-created framebuffer object, the pixel ownership test always succeeds as the framebuffer object owns all the pixels.
Scissor Test:剪裁測試,判斷像素是否在由 glScissor 定義的剪裁矩形內,不在該剪裁區域內的像素就會被剪裁掉;
Stencil Test:模版測試,將模版緩存中的值與一個參考值進行比較,從而進行相應的處理;
Depth Test:深度測試,比較下一個片段與幀緩衝區中的片段的深度,從而決定哪一個像素在前面,哪一個像素被遮擋;
Blending:混合,混合是將片段的顏色和幀緩衝區中已有的顏色值進行混合,並將混合所得的新值寫入幀緩衝;
Dithering:抖動,抖動是使用有限的色彩讓你看到比實際圖象更多色彩的顯示方式,以緩解表示顏色的值的精度不夠大而導致的顏色劇變的問題。

7.Framebuffer:幀緩衝區,這是渲染管線流水線的最後一個階段,Framebuffer 中存儲這可以用於渲染到屏幕或紋理中的像素值,也可以從Framebuffer 中讀回像素值,但不能讀取其他值(如深度值,模版值等),可以直接在GPU上進行渲染。
在這裏插入圖片描述
在kanzi中如何使用shader寫特效
在kanzi中開發者需要寫Vertex Shader頂點着色器、Fragment Shader片元着色器即可,kanzi底層會調用openGL的接口進行渲染管線流水線操作,即可實現效果。

實戰:在飛思卡爾imx6D芯片平臺上,可以流暢的跑雷電特效,50FPS
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章