Unity3D Shader 渲染流程
Shader渲染流程是CPU和GPU合作渲染一幀的過程,繪製過程分為三個階段:
應用程式階段(CPU控制)、幾何階段(GPU控制)、光柵化階段(GPU控制)
應用程式階段:主要進行CPU和記憶體的演算法。在這個階段的主要工作是準備好那些物件要被渲染、被剔除等,然後載入到記憶體,設定好物件需要渲染的狀態(材質、紋理等),最後輸出渲染圖元。
幾何階段:它從CPU哪裡接收來渲染圖元,進行對頂點座標轉換、裁剪、投影以及螢幕對映的工作,然後輸出經過變換和投影之後的頂點座標、顏色、以及紋理座標交給光柵器進行處理。
光柵化階段:該階段通過接受幾何階段的資料用來在螢幕上生成畫素,並渲染成最終的影象。該階段主要進行畫素操作
,任務是決定每個渲染圖元中那些畫素會被繪製在螢幕上。
渲染流程-幾何階段
1、頂點著色器
頂點著色器是完全可編譯的,處理單位是頂點,每個頂點都會呼叫一次頂點著色器,主要用於實現頂點的座標轉換、頂點著色兩大功能。
頂點變換有以下幾個階段:模型空間—世界空間—檢視空間—剪裁空間
2、投影
著色之後渲染系統執行投影,將觀察體置換到點(-1,-1,-1)到(1,1,1)的單位立方體,單位立方體也叫規則觀察體。有兩種常用的投影方法,分別是正交投影和透視投影(就是Unity這個選項,如圖)
觀察體的正交檢視通常就是一個矩形盒子,正交投影的主要特點是變換之後水平線依然是平等的,正交變換是平移和縮放的結合。如下為正交投影圖(矩形的大小可以自行調節)。
透視投影比較像是我們的眼睛,投影之後遠離攝像機的物體看起來小一點,靠近攝像機的物體更大一點,觀察體是錐體,同樣被轉換到單位立方體中。
從一個體到另一個矩陣變換被稱為投影,因為變換之後,z座標是不會儲存在生成的影象中的,經過投影模型從三維變成二維。
3、剪裁
只有圖元全部或部分在觀察體內才能被傳遞到光柵階段,然後繪製到螢幕上,這一階段主要是把不在視野範圍內的圖元給剔除掉,僅對部分可見的圖元進行裁剪,同時會根據圖片朝向或者背離相機來決定是否需要剔除。
這一階段是不可程式設計的,但是我們可以通過定義裁剪面或者設定正反面剔除模式來進行配置。
4、對映
這一階段是不可配置也不可程式設計的,主要是用來實現圖元的座標轉換到螢幕座標
渲染流程-光柵化階段
1、三角形設定
根據上一個階段輸出的三角網格的三個頂點,計算光柵化一個三角形網格所需要的資訊。簡單來說就是通過計算每條邊和邊界畫素的資訊,來得到整個三角形對螢幕上畫素的覆蓋情況。
2、三角形遍歷
檢查每個畫素是否被一個三角形網格所覆蓋。如果覆蓋就會生成一個片元。找到那些畫素被三角網格覆蓋的過程就是三角形遍歷。三角形遍歷階段還會是使用三角網格的3個頂點資訊對整個覆蓋區域的畫素進行差值。
輸出的片元並不是真正意義上的畫素,而是包含了很多狀態的集合,這些狀態用來計算最終顏色。這些狀態包括但不限於他的螢幕座標,深度資訊,法線,紋理座標等。
3、片元著色器
在這一階段會遍歷上一階段的片元序列並對每個片元執行片元著色器。在這個階段最重要的技術就是進行紋理取樣。
注:片元著色器進影響單個片元。
4、逐片元操作
該階段的主要目的是:將上一階段輸出的片元顏色與顏色緩衝區中的顏色進行混合。
主要工作過程是:
①、檢測片元的可見性:檢測包括對片元進行模板測試和深度測試。
②、將通過檢測的片元與顏色緩衝區中的顏色按照指定的方式進行混合,將沒有通過檢測的片元捨棄掉