雙面樣板 (Direct3D 9)
陰影磁碟區用於使用樣板緩衝區繪製陰影。 應用程式會藉由遮蔽幾何、計算剪影邊緣並將其從光線立體化成一組 3D 磁碟區來計算陰影磁碟區。 然後,這些磁碟區會轉譯成樣板緩衝區兩次。
第一個轉譯會繪製正向多邊形,並遞增樣板緩衝區值。 第二個轉譯會繪製陰影磁碟區的反向多邊形,並遞減樣板緩衝區值。 一般而言,所有遞增和遞減的值都會彼此取消。不過,場景已經以正常幾何呈現,導致某些像素在轉譯陰影磁碟區時失敗 z 緩衝區測試。 樣板緩衝區中左邊的值會對應到陰影中的圖元。 這些剩餘的樣板緩衝區內容會作為遮罩使用,以Alpha將大型、全圍的黑色四邊形混合到場景中。 使用樣板緩衝區做為遮罩,結果就是將陰影中的圖元變暗。
這表示每個光源會繪製陰影幾何兩次,因此對 GPU 的頂點輸送量施加壓力。 雙面樣板功能的設計是為了減輕這種情況。 在此方法中,有兩組樣板狀態(如下所示),一組分別針對正面三角形,另一組用於反向三角形。 如此一來,每個陰影磁碟區只會繪製單一傳遞,每個光線。
API 變更僅限於一組新的轉譯狀態。 新的轉譯狀態D3DRS_Two_Sided_StencilMODE可以設定為 TRUE 或 FALSE。 默認為 FALSE ,表示目前 (DirectX 8) 行為。 當此值設定為 TRUE 時(只有在設定D3DSTENCILCAPS_TWOSIDED時才適用),下列轉譯狀態只會套用至正面 (順時針) 三角形。
轉譯狀態 | 描述 |
---|---|
D3DRS_STENCILFAIL | D3DSTENCILOP樣板測試失敗時執行。 |
D3DRS_STENCILZFAIL | D3DSTENCILOP樣板測試通過且 z-test 失敗時執行。 |
D3DRS_STENCILPASS | D3DSTENCILOP樣板和 z 測試都通過時執行。 |
D3DRS_STENCILFUNC | D3DCMPFUNC fn. 樣板測試通過(ref & mask)樣板(樣板和遮罩)是否為真。 |
一組新的轉譯狀態會套用至反向 (逆時針) 三角形。
轉譯狀態 | 描述 |
---|---|
D3DRS_CCW_STENCILFAIL | D3DSTENCILOP樣板測試失敗時執行。 |
D3DRS_CCW_STENCILZFAIL | D3DSTENCILOP樣板測試通過且 z-test 失敗時執行。 |
D3DRS_CCW_STENCILPASS | D3DSTENCILOP樣板和 z 測試都通過時執行。 |
D3DRS_CCW_STENCILFUNC | D3DCMPFUNC函式。 樣板測試通過(ref & mask)樣板fn(樣板和遮罩)是否為真。 |
其餘樣板轉譯狀態一律適用於順時針和逆時針三角形。
行和點 Sprite 會忽略D3DRS_Two_Sided_StencilMODE,這表示行為與 DirectX 8 沒有變更。 系統會忽略D3DRS_CCW_STENCIL* 轉譯狀態。
新的上限位表示裝置是否支援這項功能。 不支援此功能的驅動程序應該忽略這些新的轉譯狀態。 所有其他樣板上限位都適用於樣板緩衝的這兩種模式。 由於Two_Sided_Stencil表示能夠使用D3DCULLMODE_NONE設定繪製,因此如果驅動程式支援這個新的樣板模式,則必須由驅動程式設定對應的上限。 Microsoft Windows 硬體質量實驗室 (WHQL) 應強制執行此原則。
新的轉譯狀態:
D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC // Same default as D3DRS_STENCILFUNC
新上限:
D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps
相關主題