天天看點

OpenGL ES渲染管線(graphics pipeline)

 渲染管線(graphics pipeline)

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

OpenGL ES渲染管線(graphics pipeline)

    圖中陰影部分的 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:在這一階段對片元着色器輸出的每一個片元進行一系列測試與處理,進而決定最終用于渲染的像素。這一系列處理過程如下:

OpenGL ES渲染管線(graphics pipeline)

    *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 中讀回像素值,但不能讀取其他值(如深度值,模版值等)。

總結:http://blog.csdn.net/kesalin

繼續閱讀