【技術美術】GPU渲染管線概述
GPU渲染管線的名稱由來
GPU渲染管線指代GPU渲染圖形的工作過程及其環境。
GPU的工作方式和狹義上分時的CPU不同,GPU類似早期的批處理系統:
- 工作前需提前配置好輸入和工作參數,運行時不可修改,直到工作結束;
- 因為GPU一般是為了渲染像素這樣的特定任務,其工作流程固定且有多道工序。
這些特徵很像工廠中的流水線,也因此便獲得了“渲染管線”的名號,前綴GPU則是用於區分“引擎渲染管線”。
GPU渲染管線中的工作步驟
詳解:【技術美術】GPU渲染管線筆記
完全可以把GPU渲染管線看成是一種工廠流水線,那該工廠的產品生產步驟由如下完成:
- 輸入裝配器階段:準備渲染管線要用的各種數據以及管線設置的配置。
- 頂點着色器階段:分析頂點數據確定幾何物體在屏幕上的數學位置。
- 分割階段:可選的能夠自動分割幾何物體的階段。
- 殼着色器階段:提供分割參數和控制點數據。
- 細化器階段
- 域着色器階段:根據控制點和權重產生分割後的新頂點。
- 幾何着色器階段:可選的能夠根據幾何物體點線面再生成新點線面的階段。
- 光柵化階段:根據幾何物體的數學位置,確認其在屏幕上的物理像素,並插值頂點數據。
- 裁剪測試:剔除超出顯示範圍(視口)的那些肯定看不見的像素。
- 早期深度測試:提前進行深度測試,以減少無效的片段着色器計算。
- 片段着色器階段:根據頂點數據和各種其他資源給像素進行最終上色。
- 輸出合併階段:對計算出的新像素數據進行後處理,並決定如何與上次計算的數據混合。
- Alpha測試:舊管線功能,用於根據Alpha進行剔除,目前用
clip()替代,是第一個且可編程的剔除階段。 - 模板測試:利用可選的模板功能進行像素剔除。
- 深度測試:利用像素的深度位置進行像素剔除。
- 混合:決定新的像素顏色如何寫入到顏色附件中。
GPU渲染管線中的資源
緩衝區
緩衝區是GPU中最多的數據類型,實際上下文的紋理、附件也是一種緩衝區,他們的本質都是一個字節數組,只是其數據含義有所不同。
- 頂點緩衝區:存放頂點的緩衝區,頂點數據由用户自行定義,甚至為空也是可以的。
- 索引緩衝區:存儲每個基元頂點對應在頂點緩衝區中位置的緩衝區,如果基元是三角形,那每三個索引,描述一個三角形。
- 常量緩衝區:用户自定義的可選只讀數據緩衝區,可以提供各種渲染時需要的統一數據,例如時間、矩陣之類。
紋理
紋理對應的就是圖片,但需要使用GPU支持的格式進行存儲。GPU對其實現了很多特殊功能,例如按0-1插值訪問,mipmap等。
- 1D紋理、1D紋理數組
- 2D紋理、2D紋理數組
- 3D紋理
- Cube紋理
附件
每次繪製完成後用於存儲最終像素信息的緩衝區。如果將其用於在屏幕上呈現,那一般分辨率與屏幕一致。本質也是紋理,因此每次繪製完後還可以將其反向作為輸入。
- 顏色附件:用於存儲上次繪製的顏色信息,每次繪製新顏色時,需選擇如何覆蓋舊數據,例如混合或直接覆蓋。
- 深度模板附件:像素可以額外存儲深度和掩碼信息,用於處理遮擋時的繪製順序問題,以及利用可選的模板功能來實現自定義效果。
渲染狀態
對管線各種功能的設置,告訴GPU如何處理數據,以及提供一些可選功能,常用的設置如下:
- 基元類型:確定要繪製的基元類型(索引緩衝區的數據結構),如點、線、三角面、四邊面。
- 混合方式:如何混合顏色附件中的舊數據和要寫入的新數據。
- 正面方向和剔除方向:繪製面時可以根據頂點的順逆時針順序判斷其正反方向,可以決定要繪製哪個方向。
- 深度測試、深度寫入、深度偏移:如何進行深度測試,以及是否寫入深度,以及對深度的偏移。
- 模板測試和模板寫入:如何進行模板測試、以及如何寫入模板掩碼數據。
着色器
實現對GPU中部分階段的編程,通過代碼的方式具體控制各種繪製效果的實現。
- 頂點着色器
- 殼着色器
- 域着色器
- 幾何着色器
- 片段着色器