本章主要講遮擋,作者認為比較復雜有難度的知識點,作為基礎教程不會深入講解。
GPU渲染管線
主要包括以下階段
- 輸入裝配(IA):讀取頂點數據 ,定義頂點數據結構
- 頂點著色(VS):變換頂點到屏幕空間,Shader程序VSMain()
- 曲面細分 & 幾何著色(HS/DS/GS,可選)
- 光柵化(Rasterization):將 3D 物體轉換為 2D 像素
- 像素著色(PS):計算最終顏色
- 輸出合并(OM):寫入顏色緩沖 & 深度緩沖
光柵化(Rasterization):指的是通過頂點數據找到屏幕中需要顯示的像素的過程,通過光柵化,我們將空間上連續的線條轉化為屏幕中離散的像素(頂點數據到像素點),由硬件實現。
比如 在光柵化階段時 使用 Z-Buffer(深度緩沖) 進行深度測試(Depth Test),決定像素是否可見。流程:
- 片元深度值 與 Z-Buffer 進行比較
- 深度測試通過 → 繼續執行像素著色器(PS)
- 深度測試失敗 → 丟棄像素,不執行 PS
深度模板視圖 (DSV)
深度模板視圖用于訪問深度緩沖和模板緩沖資源。深度緩沖用來存儲每個像素的深度值,以此來判定哪些像素該被渲染,哪些該被舍棄。模板緩沖則存儲每個像素的模板值,可用于實現如陰影、遮罩這類特效。
D3D12中的剔除(Culling)是指從渲染過程中排除那些不需要渲染的對象,以減少計算量和提高渲染效率。
深度緩沖
深度緩沖區(或 z-Buffer 緩沖區)存儲深度信息,以控制渲染(而不是從視圖中隱藏)哪些多 邊形區域。
模板緩沖
模板緩沖區用于遮罩圖像中的像素,以產生特殊效果。 掩碼控制是否繪制像素。 特殊效 果包括合成、貼紙、溶解、淡化、滑動、輪廓描繪和剪影,以及雙面模板。
模板緩沖通過模板測試來決定哪些像素點可以被渲染。當啟動模板測試時,片段像素點的值與模板緩沖區中的值進行比較,根據比較結果決定該像素點是否應該被繪制。模板測試的具體過程包括設置參考值和掩碼,并根據測試結果對模板緩沖區的值進行相應的修改
具體應用場景
- 鏡像效果:在渲染鏡子時,模板緩沖區可以用來阻止鏡子范圍以外的鏡像部分被繪制,從而只顯示鏡子中的反射部分
- 遮罩效果:通過設置模板緩沖區的值,可以實現遮罩效果,只渲染特定區域的像素,從而實現一些特殊的圖形效果
- 光照和陰影效果:模板緩沖區可以用于實現光照和陰影效果,通過在渲染過程中對模板緩沖區進行修改,可以模擬光照的效果
創建深度模板視圖(DSV)
1. 填充D3D12_DEPTH_STENCIL_VIEW_DESC結構
2.填充 D3D12_CLEAR_VALUE結構 并 創建資源 (CreateCommittedResource())
3. 通過CreateDepthStencilView()創建 深度模板視圖 (DSV)
剔除
剔除的定義和作用
剔除是指在渲染過程中,根據一定的規則,將那些不會出現在最終視圖中的對象或面片從渲染列表中移除,從而減少GPU的工作量,提高渲染效率和幀率。剔除技術主要包括以下幾種:
背面剔除(Backface Culling):這是最常見的剔除技術,它只渲染面向攝像機的面,背對攝像機的面則不進行渲染。背面剔除可以顯著減少需要處理的幾何體數量,因為大多數場景中的物體只有一面是可見的。
視錐體剔除(Frustum Culling):視錐體剔除是通過判斷物體是否在攝像機的視錐體內來決定是否渲染該物體。只有完全在視錐體內的物體才會被渲染,這樣可以有效減少不必要的渲染計算。
遮擋剔除(Occlusion Culling):遮擋剔除是通過預先計算的遮擋信息來決定哪些物體可以被其他物體遮擋而不需要渲染。這種方法通常用于靜態場景,可以顯著減少需要渲染的物體數量。
謂詞
D3D12中的謂詞(Predicate)主要用于控制渲染操作的條件執行。謂詞可以是一個布爾表達式,用于決定是否執行某些渲染命令。在D3D12中,謂詞通常與命令列表(Command List)一起使用,以實現條件渲染。
謂詞在D3D12中的作用主要體現在以下幾個方面:
1.?? ?條件渲染:通過謂詞,開發者可以控制渲染操作是否執行。例如,可以根據時間、用戶輸入或其他條件來決定是否渲染某個對象。
2.?? ?性能優化:通過條件渲染,可以減少不必要的渲染操作,從而節省資源并提高渲染效率。
使用D3D12中的謂詞通常涉及以下步驟:
定義謂詞:創建一個布爾表達式或函數,該表達式根據特定條件返回true或false。
設置命令列表:在命令列表中設置謂詞,指定哪些渲染操作需要基于該謂詞的條件執行。
執行命令列表:當謂詞條件滿足時,命令列表中的相關渲染命令才會被執行。
void SetPredication([in, optional] ID3D12Resource *pBuffer,UINT64 AlignedBufferOffset,D3D12_PREDICATION_OP Operation
);
當 GPU 執行 SetPredication 命令時,它會提取緩沖區中的值快照。 緩沖區中數據的未來更改不會追溯性地影響預測狀態。
如果輸入參數緩沖區(pBuffer)為 NULL,則禁用預測。
D3D12 API 中不存在謂詞提示;直接、計算和復制命令列表允許進行謂詞。 源緩沖區可以位于任何堆類型(默認、上傳、讀取、自定義)。
?D3D12代碼示例http://GitHub - microsoft/DirectX-Graphics-Samples: This repo contains the DirectX Graphics samples that demonstrate how to build graphics intensive applications on Windows.其中D3D12PredicationQueries 示例渲染了兩個四邊形;其中一個會動起來,周期性地遮擋另一個。對于每個渲染的幀,執行一個二進制遮擋查詢,并使用setpredicate API來有條件地繪制潛在遮擋的四邊形。當查詢確定四邊形被完全遮擋時,不執行渲染(隱藏一個四邊形)。
感謝大家的支持,如要問題歡迎提問指正。
?