【技術美術】GPU渲染管線概述

GPU渲染管線的名稱由來

GPU渲染管線指代GPU渲染圖形的工作過程及其環境。

GPU的工作方式和狹義上分時的CPU不同,GPU類似早期的批處理系統:

  1. 工作前需提前配置好輸入和工作參數,運行時不可修改,直到工作結束;
  2. 因為GPU一般是為了渲染像素這樣的特定任務,其工作流程固定且有多道工序。

這些特徵很像工廠中的流水線,也因此便獲得了“渲染管線”的名號,前綴GPU則是用於區分“引擎渲染管線”。

渲染管線理論總結_數據

GPU渲染管線中的工作步驟

詳解:【技術美術】GPU渲染管線筆記

完全可以把GPU渲染管線看成是一種工廠流水線,那該工廠的產品生產步驟由如下完成:

  1. 輸入裝配器階段:準備渲染管線要用的各種數據以及管線設置的配置。
  2. 頂點着色器階段:分析頂點數據確定幾何物體在屏幕上的數學位置。
  3. 分割階段:可選的能夠自動分割幾何物體的階段。
  1. 殼着色器階段:提供分割參數和控制點數據。
  2. 細化器階段
  3. 域着色器階段:根據控制點和權重產生分割後的新頂點。
  1. 幾何着色器階段:可選的能夠根據幾何物體點線面再生成新點線面的階段。
  2. 光柵化階段:根據幾何物體的數學位置,確認其在屏幕上的物理像素,並插值頂點數據。
  1. 裁剪測試:剔除超出顯示範圍(視口)的那些肯定看不見的像素。
  2. 早期深度測試:提前進行深度測試,以減少無效的片段着色器計算。
  1. 片段着色器階段:根據頂點數據和各種其他資源給像素進行最終上色。
  2. 輸出合併階段:對計算出的新像素數據進行後處理,並決定如何與上次計算的數據混合。
  1. Alpha測試:舊管線功能,用於根據Alpha進行剔除,目前用clip()替代,是第一個且可編程的剔除階段。
  2. 模板測試:利用可選的模板功能進行像素剔除。
  3. 深度測試:利用像素的深度位置進行像素剔除。
  4. 混合:決定新的像素顏色如何寫入到顏色附件中。

GPU渲染管線中的資源

緩衝區

緩衝區是GPU中最多的數據類型,實際上下文的紋理、附件也是一種緩衝區,他們的本質都是一個字節數組,只是其數據含義有所不同。

  • 頂點緩衝區:存放頂點的緩衝區,頂點數據由用户自行定義,甚至為空也是可以的。
  • 索引緩衝區:存儲每個基元頂點對應在頂點緩衝區中位置的緩衝區,如果基元是三角形,那每三個索引,描述一個三角形。
  • 常量緩衝區:用户自定義的可選只讀數據緩衝區,可以提供各種渲染時需要的統一數據,例如時間、矩陣之類。

紋理

紋理對應的就是圖片,但需要使用GPU支持的格式進行存儲。GPU對其實現了很多特殊功能,例如按0-1插值訪問,mipmap等。

  • 1D紋理、1D紋理數組
  • 2D紋理、2D紋理數組
  • 3D紋理
  • Cube紋理

附件

每次繪製完成後用於存儲最終像素信息的緩衝區。如果將其用於在屏幕上呈現,那一般分辨率與屏幕一致。本質也是紋理,因此每次繪製完後還可以將其反向作為輸入。

  • 顏色附件:用於存儲上次繪製的顏色信息,每次繪製新顏色時,需選擇如何覆蓋舊數據,例如混合或直接覆蓋。
  • 深度模板附件:像素可以額外存儲深度和掩碼信息,用於處理遮擋時的繪製順序問題,以及利用可選的模板功能來實現自定義效果。

渲染狀態

對管線各種功能的設置,告訴GPU如何處理數據,以及提供一些可選功能,常用的設置如下:

  • 基元類型:確定要繪製的基元類型(索引緩衝區的數據結構),如點、線、三角面、四邊面。
  • 混合方式:如何混合顏色附件中的舊數據和要寫入的新數據。
  • 正面方向和剔除方向:繪製面時可以根據頂點的順逆時針順序判斷其正反方向,可以決定要繪製哪個方向。
  • 深度測試、深度寫入、深度偏移:如何進行深度測試,以及是否寫入深度,以及對深度的偏移。
  • 模板測試和模板寫入:如何進行模板測試、以及如何寫入模板掩碼數據。

着色器

實現對GPU中部分階段的編程,通過代碼的方式具體控制各種繪製效果的實現。

  • 頂點着色器
  • 殼着色器
  • 域着色器
  • 幾何着色器
  • 片段着色器