對OpenGLES2.0渲染管線的理解

        在學習OpenGLES時,每一本書開始都會向我們介紹渲染管線,當我在開始學習它時,看這些東西完全不明白在說什麼,經過一段時間對3D程序的開發和研究現在對渲染管線也有了一些自己的理解。由於WebGL是基於OpenGLES2.0實現的一套JavaScript封裝API(其中也有一些特有的部分),那麼就先聊聊我對OpenGLES2.0渲染管線的理解吧。


        我們就從這張圖開始理順OpenGLES2.0的渲染流程吧!

        1.基本處理:

        首先在該階段將物體的信息傳遞給GPU其中包括了頂點位置,頂點的紋理座標,頂點顏色等,最後還需要設置繪製方式,其中包括了:點繪製、線段繪製、三角形繪製。

        2.頂點緩衝區對象(VBO)/頂點數組對象(VAO):

        這部分功能是可選的,在模型的基本信息基本不變的情況下,我們可以通過將數據放入顯存而不用每次從內存向顯存傳遞,從而減少IO開銷(VBO),並使用數組記錄每一塊數據對應綁定的類型(頂點位置、法向量),這也是優化的一種方法(VAO)其具體說明可以看我的另一篇博客,其中有詳細的介紹:http://blog.csdn.net/srk19960903/article/details/74999018

        3.頂點着色器

        頂點着色器爲一個可編程的處理單元,功能爲執行頂點的變換、光照、材質的應用與計算等頂點的相關操作,其每頂點執行一次。其工作過程爲首先將原始的頂點幾何信息及其他屬性傳送到頂點着色器中,經過自己開發的頂點着色器處理後產生紋理座標、顏色、點位置等後繼流程需要的各項頂點屬性信息,然後將其傳遞給圖元裝配階段。

        4.圖元裝配

        圖元裝配主要分爲兩個階段:圖元組裝和圖元處理。

        圖元組裝:將頂點着色器處理好的頂點進行組成,組裝的方式有點繪製、線段繪製和常用的三角形繪製。點繪製方式下每個圖元僅需要一個單獨的頂點,此方式下每個頂點爲一個圖元;線段繪製方式每個圖元則需要兩個頂點,此方式下每兩個頂點構成一個圖元;三角形繪製方式下需要3個頂點構成一個圖元。

        圖元處理:首先需要消除位於半空間(half-space)之外的部分幾何圖元,這個半空間是由一個剪裁平面所定義的。例如,點剪裁就是簡單地接受或者拒絕頂點,線段或多邊形剪裁可能需要增加額外的頂點,具體取決於直線或者多邊形與剪裁平面之間的位置關係,剪裁時,若圖元完全位於視景體以及自定義剪裁平面的內部,則將圖元傳遞到後面的步驟進行處理;如果其完全位於視景體或者自定義剪裁平面的外部,則丟棄該圖元;如果其有一部分位於內部,另一部分位於外部,則需要剪裁該圖元。最後如果開啓了背面剪裁還需要判斷改圖元是否是背面面對攝像機,如果是則需要將其剔除。

        5.光柵化

        光柵化是將圖元轉化爲一組二維片段的過程,然後,這些片元由片元着色器處理。這些二維片元代表着可在屏幕上繪製的像素。用於從分配給每個圖元頂點的頂點着色器輸出生成每個片元值的機制稱作插值。簡單來說就是將3D空間中的物體轉換成屏幕上的一個個像素點(其實應該稱之爲“候選像素點”,因爲後面還有深度測試會剔除被擋住的部分),此時這些點是沒有顏色的只有位置信息和深度信息,具體的顏色還需要在片元着色器中進行賦值。

       6.片元着色器

        片元着色器是用於處理片元值及其相關數據的可編程單元,其可以執行紋理的採樣、顏色的彙總、計算霧顏色等操作,每片元執行一次。片元着色器主要功能爲通過重複執行(每片元一次),將3D物體中的圖元光柵化後產生的每個片元的顏色等屬性計算出來送入後繼階段,如剪裁測試、深度測試及模板測試等。

        7.剪裁測試

        如果程序中啓用了剪裁測試,OpenGLES會檢查每個片元在幀緩衝中對應的位置,若對應位置在剪裁窗口中則將此片元送入下一階段,否則丟棄此片元。也就是可以在屏幕上指定一片區域繪製,不在這片區域不進行繪製。

        8.深度測試與模板測試

        深度測試:

        深度測試是指將輸入片元的深度值與幀緩衝區中存儲的對應位置片元的深度值進行比較,若輸入片元的深度值小則將輸入片元送入下一階段準備覆蓋幀緩衝中的原片元或與幀緩衝中的原片元混合,否則丟棄輸入片元。

        模板測試:

        模板測試的主要功能爲將繪製區域限定在一定的範圍內,一般用在湖面倒影、鏡像等場合,我的另一篇博客也有對此的 介紹http://blog.csdn.net/srk19960903/article/details/73928426

        9.顏色緩衝混合

        若程序中開啓了Alpha混合,則根據混合因子將上一階段送來的片元與幀緩衝中對應位置的片元進行Alpha混合;否則送入的片元將覆蓋幀緩衝中對應位置的片元。

        10.幀緩衝

        OpenGL ES中的物體繪製並不是直接在屏幕上進行的,而是預先在幀緩衝區中進行繪製,每繪製完一幀再將繪製的結果交換到屏幕上。因此,在每次繪製新的一幀時都需要清除緩衝區中的相關數據,否則有可能產生不正確的繪製效果。

        哇咔咔,打了這麼多字終於一點一點的把自己對OpenGLES渲染管線的理解總結完了,希望大家能夠多提意見~嗯嗯,因爲OpenGLES2.0與WebGL還是有着一些差距,所以下次準備研究研究WebGL上的VAO,VBO還有FBO這些~

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