渲染管線的三個概念階段

2021-08-21 13:14:16 字數 2671 閱讀 9677

渲染流水線可以分為三個概念性階段:應用階段,幾何階段,光柵化階段。

遊戲場景中的物體渲染都是基於可程式設計流水線實現的,其實就是把繪製的3d物體通過可程式設計流水線繪製在2d的螢幕上的過程。

什麼是渲染(rendering)

渲染簡單的理解可能可以是這樣:就是將三維物體或三維場景的描述轉化為一幅二維影象,生成的二維影象能很好的反應三維物體或三維場景

基於深度緩衝的三角形光柵化基礎

實時渲染引擎需要以最低每秒30幀顯示渲染出來的影象,從而產生運動錯覺,也就是要以最長33.3ms內產生每一幀,通常實際可用的時間更少,因為其它系統如動畫、物理、音訊等引擎系統都需要占用時間資源;

三維場景渲染的本質---幾個重要基本步驟

在遊戲中的場景渲染,主要著重於渲染物體的表面,對其內部的反射、折射、吸收等行為不關注;渲染導致的不準確性,通常由模擬來使其看起來真實,如煙使用粒子效果來表現,實際上是由大量的半透明矩形卡板所合成;

這個階段相對比較好理解,就比如我們在unity裡開發了乙個遊戲,其實很多底層的東西unity都幫我們實現好了,例如碰撞檢測、視錐剪裁等等,這個階段主要是和cpu、記憶體打交道,在把該計算的都計算完以後,在這個階段的末端,這些計算好的資料(頂點座標、法向量、紋理座標、紋理)就會通過資料匯流排傳給圖形硬體,作為我們進一步處理的源資料。 

主要有三個任務:

a.準備好場景資料,例如攝像機的位置,視錐體,場景中的模型以及使用的光源等

b.為了提高渲染效能,通常需要做乙個粗粒度剔除(culling)工作,把那些在場景中不可見的物體剔除出去,這樣這些物體就不需要再移交給幾何階段處理;

c.需要設定好每個模型的渲染狀態,這些渲染狀態包括但不限於它使用的材質紋理shader等。

這一階段的輸出是渲染所需要的幾何資訊,即渲染圖元。

其中每個渲染圖元裡包含了該圖元所對應的所有頂點資料。例如,在opengl中,如果我們繪製乙個三角形,我們需要在程式中制定頂點位置,指定圖元型別,這些都是需要cpu先準備好。

幾何階段用於處理所有和我們需要繪製的幾何相關的工作。例如:決定需要繪製的圖元是什麼,怎樣繪製,在哪繪製。

主要負責頂點座標變換、光照、裁剪、投影以及螢幕對映,該階段基於gpu進行運算,在該階段的末端得到了經過變換和投影之後的頂點座標、顏色、以及紋理座標。簡而言之,幾何階段的主要工作就是「變換三維頂點座標」和「光照計算」。 

問題隨之而來,為什麼要變換頂點座標?我是這麼理解的,比如你有乙個三維遊戲場景,場景中的每個模型都可以用乙個向量來確定它的位置,但如何讓計算機根據這些座標把模型正確的、有層次的畫在螢幕上?這就是我們需要變換三維頂點座標的原因,最終目的就是讓gpu可以將這些三維資料繪製到二維螢幕上。 

該階段的重要任務就是:把頂點座標變換到螢幕空間中,再交給光柵器進行處理,所以該階段還是側重與幾何計算部分,而不是給物體「上色」。

通過對輸入的渲染圖元進行多步處理後,這一階段將會輸出:螢幕空間的二維頂點座標、每個座標對應的深度值、著色等相關資訊,並傳遞給下一階段。

更多細節部分可以參考:

具體的光柵化細節可以參考:渲染管線在gpu中的各個階段

這一階段會使用上個階段傳遞的資料來產生螢幕上的畫素,並渲染出最終的影象。

光柵化的任務:主要是決定每個渲染圖元中的哪些畫素應該被繪製到螢幕上。它需要對上乙個階段得到的逐頂點資料進行插值,然後再進行逐畫素處理。

光柵化其實是一種將幾何圖元變為二維影象的過程,該過程主要包含了兩部分的工作,光柵化和片元著色。

光柵化:決定視窗座標中的哪些整型柵格區域被基本圖元占用,這一部分主要對應著三角形設定和三角形遍歷兩個階段通過插值計算完成,這一階段輸出乙個片元序列,之後的片元著色器就會對該片元序列進行處理。

片元著色:分配乙個顏色值和乙個深度值到各個區域。

經過上面的步驟之後,我們得到了每個點的螢幕座標值,和我們需要繪製的圖元,但此時還有兩個問題: 

(1)螢幕座標是浮點數,但畫素是用整數來表示的,如何確定螢幕座標值所對應的畫素? 

(2)如何根據已確定位置的點,在螢幕上畫出線段或者三角形? 

對於問題1,繪製的位置只能接近兩指定端點間的實際線段位置,例如,一條線段的位置是(10.48, 20.51),轉換為畫素位置就是(10,21)。 

問題2,我們所要解決的問題就是根據三角形的三個頂點來判斷哪些畫素在這個三角形內,這就轉化為判斷乙個頂點是否在三角形內的問題,這也是opengl三角形遍歷中乙個重要的演算法。

這個過程結束後,頂點和圖元已經對應到畫素,之後的流程就是如何處理畫素,即給畫素賦予顏色值。 

給畫素賦予顏色的階段稱為pixel operation,也就是逐片元操作,是在更新幀快取之前,執行最後一系列針對每個片段的操作,其目的是計算出每個畫素的顏色值。

在這個階段,主要進行的就是一些逐片元操作,先後是模板測試,深度測試,混合,最後寫入幀快取。

pixel operation包含下面這些流程: 

(1)消除遮擋面,深度測試可以消除遮擋面; 

(2)texture operation,紋理操作也就是文理取樣,根據畫素的紋理座標,查詢對應的紋理值; 

(3)blending,通常稱為alpha blending,根據目前已經畫好的顏色,與正在計算的顏色的alpha值混合,形成新的顏色。 

(4)filtering,將正在計算的顏色經過某種濾鏡後輸出。 

該階段之後,畫素的顏色值被寫入幀快取中。 

事件的三個階段

事件冒泡 多個元素巢狀關係,這些元素都註冊了相同的事件型別,那麼,如果我們觸發了最裡面的元素的事件,外面的所有的元素的事件也會自動觸發,這種行為叫事件冒泡 事件的階段 1.捕獲階段 由外向內 2.當前目標階段 選擇觸發事件 3.冒泡階段 由內向外 e.eventphase屬性可以檢視觸發顯示的階段 ...

程式生成的三個階段

程式生成主要分成編譯 彙編 連線等幾個步驟 編譯是指把用高階語言編寫的程式轉換成相應處理器的組合語言程式的過程。從本質上講,編譯是乙個文字轉換的過程。對嵌入式系統而言,一般要把用c語言編寫的程式轉換成處理器的彙編 編譯過程包含了c語言的語法解析和組合語言的生成兩個步驟。彙編一般是逐個檔案進行的,對於...

Event事件的三個階段

www.w3school.com.cn htmldom event bubbles.asp 在 2 級 dom標準中,事件傳播分為三個階段 第一,捕獲階段。事件從 document 物件沿著文件樹向下一級一級傳遞給目標節點。如果目標的任何乙個先輩註冊了捕獲事件控制代碼比如document.onkey...