OpenGL ES渲染管線

2021-07-12 02:40:39 字數 2360 閱讀 8103

渲染管線(graphics pipeline)

在 opengl es 1.0 版本中,支援固定管線,而 opengl es 2.0 版本不再支援固定管線,只支援可程式設計管線。什麼是管線?什麼又是固定管線和可程式設計管線?管線(pipeline)也稱渲染管線,因為 opengl es在渲染處理過程中會順序執行一系列操作,這一系列相關的處理階段就被稱為opengl es 渲染管線。pipeline **於福特汽車生產車間的流水線作業,在opengl es 渲染過程中也是一樣,乙個操作接著乙個操作進行,就如流水線作業一樣,這樣的實現極大地提供了渲染的效率。整個渲染管線如下圖所示:

圖中陰影部分的 vertex shader 和 fragment shader 是可程式設計管線。可程式設計管線就是說這個操作可以動態程式設計實現而不必固定寫死在**中。可動態程式設計實現這一功能一般都是指令碼提供的,在opengl es 中也一樣,編寫這樣指令碼的能力是由著色語言(shader language)提供的。那可程式設計管線有什麼好處呢?方便我們動態修改渲染過程,而無需重寫編譯**,當然也和很多指令碼語言一樣,除錯起來不太方便。

再回到上圖,這張圖就是 opengl es 的「架構圖」,學習opengl es 就是學習這張圖中的每乙個部分,在這裡先粗略地介紹一下:

1.vertex array/buffer objects:頂點資料**,這時渲染管線的頂點輸入,通常使用 buffer objects效率更好。在今天的示例中,簡單起見,使用的是 vertex array;

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:在這一階段對片元著色器輸出的每乙個片元進行一系列測試與處理,從而決定最終用於渲染的畫素。這一系列處理過程如下:

*scissor test:剪裁測試,判斷畫素是否在由 glscissor 定義的剪裁矩形內,不在該剪裁區域內的畫素就會被剪裁掉;

*stencil test:模版測試,將模版快取中的值與乙個參考值進行比較,從而進行相應的處理;

*depth test:深度測試,比較下乙個片段與幀緩衝區中的片段的深度,從而決定哪乙個畫素在前面,哪乙個畫素被遮擋;

*blending:混合,混合是將片段的顏色和幀緩衝區中已有的顏色值進行混合,並將混合所得的新值寫入幀緩衝;

*dithering:抖動,抖動是使用有限的色彩讓你看到比實際圖象更多色彩的顯示方式,以緩解表示顏色的值的精度不夠大而導致的顏色劇變的問題。

7.framebuffer:這是流水線的最後乙個階段,framebuffer 中儲存這可以用於渲染到螢幕或紋理中的畫素值,也可以從framebuffer 中讀回畫素值,但不能讀取其他值(如深度值,模版值等)。

OpenGL ES 渲染管線

頂點著色器是乙個可程式設計的處理單元 執行頂點的變換 透視矩陣 光照 材質的應用等與計算等頂點的相關操作 每個頂點執行一次頂點著色器 opengl es的工作流程為首先將原始的頂點幾何資訊及其他屬性傳送到頂點著色器中 經過頂點著色器處理後產生頂點座標 顏色 位置等後續流程需要的各項定點屬性資訊 然後...

整合 OpenGLES 渲染管線系列(1)

在opengl中,任何事物都在3d空間中,而螢幕和視窗卻是2d畫素陣列,這導致opengl的大部分工作都是關於把3d座標轉變為適應你螢幕的2d畫素。3d座標轉為2d座標的處理過程是由opengl的圖形渲染管線管理的。圖形渲染管線是一系列按序處理操作,可以被劃分為兩個主要部分 第一部分把你的3d座標轉...

OpenGL ES 3 0 渲染管線介紹

記住下面這張圖,其中帶陰影的方框表示 opengl es 3.0 管線中可程式設計階段。頂點著色器主要進行頂點相關的一些操作。可以用於通過矩陣變換位置 計算照明公式來生成逐頂點顏色以及生成或者變換紋理座標等基於頂點的傳統操作。產生紋理座標 顏色 點位置等資訊送往後續階段。頂點被組合成圖元的過程叫做圖...