OpenGL渲染管線

OpenGL渲染管線的一些關鍵階段:


1. 顯示列表

        任何數據,不論它描述的是幾何圖元還是像素,都可以保存在顯示列表(display list)中,供當前或以後使用。當然,也可以不把數據保存在顯示列表中,而是立即對數據進行處理,這種模式也叫立即模式(immediate mode)。當一個顯示列表執行時,保存的數據就從顯示列表中取出,就像在立即模式下直接由應用程序發送的那樣。

2. 求值器

        所有的幾何圖元最終都要通過頂點來描述。參數化曲線和表面最初可能是通過控制點以及叫做基函數(basic function)的多項式函數進行描述的 。求值器提供了一種方法,根據控制點計算表示表面的頂點。這種方法是一種多項式映射,它可以根據控制點產生表面法線、紋理座標、顏色以及控件座標值。

3. 基於頂點的操作

        對於頂點數據,接下來的一個步驟是“基於頂點的操作”,就是把頂點變換爲圖元。有些類型的頂點數據(例如空間座標)是通過一個4x4的浮點矩陣進行變換的。控件座標從3D世界的一個位置投影到屏幕上的一個位置。

        如果啓用了高級特性,這個階段將更爲忙碌。如果使用了紋理,這個階段還將生成並變換紋理座標。如果啓用了光照,就需要綜合變換後的頂點、表面法線、光源位置、材料屬性以及其他光照信息進行光照計算,產生最終的顏色值。

        從OpenGL2.0開始,對於使用固定功能的頂點處理,我們有了新的選擇,正如前面所提到的,可以使用頂點着色器來完全控制基於頂點的操作。如果使用的着色器,基於頂點的操作階段中的所有操作都會由着色器取代。在OpenGL3.1中,所有固定功能的頂點操作都刪除了(除非具體實現支持GL_AB_compatibility擴展),必須使用頂點着色器。

4. 圖元裝配

        圖元裝配的一個主要內容就是裁剪,它的任務是消除位於空間之外的那部分幾何圖元,這個半空間是由一個平面所定義的。點裁剪就是簡單的接受或拒絕頂點,直線或多邊形裁剪則可能需要添加額外的頂點,具體取決於直線或多邊形是如何進行裁剪的。

        在有些情況下,接下來需要執行一個叫做透視除法(perspective division)的步驟。它使遠處的物體看起來比近處的物體更小一些。接下來所進行的是視口(viewport)和深度(z座標)操作。如果啓用了剔除功能(culling)並且該圖元是一個多邊形,那麼它就有可能被剔除測試所拒絕。根據多變性模式,多邊形可能畫成點的形式或者直線的形式。

        這個階段產生的結果就是完整的幾何圖元,也就是根據相關的顏色、深度(有時還有紋理座標值以及和光柵化處理有關的一些指導信息)進行了變換和裁剪的頂點。

5. 像素操作

        在OpenGL的渲染管線中,和單路徑的幾何數據相比,像素數據所經歷的流程有所不同。首先,來自系統內存的一個數組中的像素進行解包,從某種格式(像素的原始格式可能有多種)解包爲適當數量的數據成分。接着,這些數據被縮放、偏移,並根據一副像素圖進行處理。處理結果先進行截取,然後或者寫入到紋理內存,或者發送到光柵化階段。

        如果像素數據是從幀緩衝區讀取的,就對它們執行像素轉換操作(縮放、偏移、映射和截取)。然後,這個結果被包裝爲一種適當的格式,並返回到系統內存的一個數組中。

        OpenGL有幾種特殊的像素複製操作,可以把數據從幀緩衝區複製到幀緩衝區的其他位置或紋理內存中。這樣,在數據寫入到紋理內存或者寫回到幀緩衝區之前,只需要進行一道像素轉換就可以了。

        所介紹的很多像素操作都是固定功能的像素管線的一部分,並且常常會在系統中來回移動大量數據。現代的圖形實現傾向於通過嘗試把圖形操作集中到位於圖形硬件中的內存,從而優化性能(當然,這一描述是一般性的,但是,當前大多數系統正是這樣實現的)。OpenGL3.0支持所有這些操作,並且引入了幀緩衝對象來幫助優化這些數據移動,特別是,這些對象可以完全避免某些數據移動。幀緩衝對象和可編程的片段着色器組合到一起,替代了很多這樣的操作(尤其顯著的是那些劃分爲像素轉移的操作),並且大大增強了靈活性。

6. 紋理裝配

        OpenGL應用程序可以在幾何物體上應用紋理圖像,使它們看上去更爲逼真。如果需要使用多幅紋理圖像,把它們放在紋理對象中是一種明智的做法。這樣,就可以很方便地在它們之間進行切換。

        幾乎所有的OpenGL實現都擁有一些特殊的資源,可以加速紋理的處理(這些資源可能是圖形實現中從一個共享資源池中分配而來的)。爲了幫助OpenGL實現高效的管理這些內存資源,優先使用紋理對象來幫助控制紋理貼圖潛在的緩存和定位問題。

7.  光柵化

        光柵化就是把幾何數據和像素數據轉換爲片段(fragment)的過程。每個片段方塊對應於幀緩衝區中的一個像素。把頂點連接起來形成直線或者計算填充多邊形的內部像素時,需要考慮直線和多邊形的點畫模式、直線的寬度、點的大小、着色模型以及用於支持抗鋸齒處理的覆蓋計算。每個片段方塊都將具有各自的顏色和深度值。

8. 片段操作

        在數據實際存儲到幀緩衝區之前,要執行一系列的操作。這些操作可能會修改甚至丟棄這些片段。所有這些操作都可以啓用和禁用。

        第一個可能執行的操作時紋理處理。在紋理內存中爲每個片段生成一個紋理單元(texel,也就是紋理元素),並應用到這個片段上。接下來,組合主顏色和輔助顏色,可能還會應用一次霧計算。如果應用程序使用了片段這色器,前面這三個操作可能都在着色器中完成。

        前面的操作生成了最終的顏色和深度之後,如果有效,執行可用的剪裁測試、alpha測試、模板測試和深度緩衝區測試(深度緩衝區實際是隱藏面消除)。某種可用的測試的失敗將會終止片段方塊的繼續處理。隨後,將要執行的可能是混合、抖動、邏輯操作以及根據一個位掩碼的屏蔽操作。最後,經過完整處理的片段就被繪製到適當的緩衝區,最終成爲一個像素併到達它的最終棲息地。

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