1 渲染流水線
渲染流水線分爲三個階段,分別是應用階段,幾何階段,光柵化階段。
1.1 應用階段:CPU實現,輸出渲染圖元。
數據加載到顯存中:顯卡對顯存(VRAM)的訪問速度比對內存(RAM)要快,並且大多數顯卡對RAM沒有訪問權限。
設置渲染狀態:定義場景中的網格是怎樣被渲染的。
調用DrawCall:CPU通過調用DrawCall告訴CPU開始一個渲染過程,一個DrawCall會指向本次渲染圖元列表
1.2 幾何結算:GPU實現,輸出屏幕空間的二位點座標,深度,着色信息,傳送給光柵化階段。
頂點着色器:對輸入的每個頂點都會調用一次頂點着色器,而且無法得到頂點與頂點之間的關係。頂點着色器的主要功能是座標變換,把頂點座標從模型空間轉換到齊次裁剪空間。再由硬件進行透視除法,最終得到歸一化的設備座標。
裁剪:裁剪刪除不在攝像機範圍內的頂點。
屏幕映射:將x和y轉到屏幕座標系,z座標無作爲,但會被一起傳進光柵化後發揮作用。
1.3 光柵化階段:GPU實現,決定每個渲染圖元哪些像素應該被繪製在屏幕上,將幾何階段傳來的頂點數據進行插值。
三角形設置:計算光柵化一個三角網格所需的信息。
三角形遍歷:檢查每個像素是否被一個三角網格所覆蓋,覆蓋則賦予片元着色器。
片元着色器;對從頂點着色器來的數據進行插值數據完成很多渲染技術,最重要的一個是紋理採樣。
逐片元操作;合併數據加操作,通過測試來決定每個片元的可見性。半透明物體必須開啓混合操作。
2 shader入門
Shader(着色器)就是GPU執行的一段針對3D對象進行一系列操作的程序。
2.1 Unity中的Shader類型
Fixed function Shader :屬於固定渲染管線 Shader, 基本用於高級Shader在老顯卡無法顯示時的回滾。 使用的是ShaderLab語言,語法與微軟的FX files 或者NVIDIA的 CgFX類似。
Vertex and Fragment Shader:最強大的Shader類型,屬於可編程渲染管線. 使用的是CG/HLSL語法。
Surface Shader:Unity3d推崇的Shader類型,使用Unity預製的光照模型來進行光照運算。 使用的也是CG/HLSL語法。
3 shader編寫
簡單的shader示例