共用方式為


雙面樣板 (Direct3D 9)

陰影磁碟區用於使用樣板緩衝區繪製陰影。 應用程式會藉由遮蔽幾何、計算剪影邊緣並將其從光線立體化成一組 3D 磁碟區來計算陰影磁碟區。 然後,這些磁碟區會轉譯成樣板緩衝區兩次。

第一個轉譯會繪製正向多邊形,並遞增樣板緩衝區值。 第二個轉譯會繪製陰影磁碟區的反向多邊形,並遞減樣板緩衝區值。 一般而言,所有遞增和遞減的值都會彼此取消。不過,場景已經以正常幾何呈現,導致某些像素在轉譯陰影磁碟區時失敗 z 緩衝區測試。 樣板緩衝區中左邊的值會對應到陰影中的圖元。 這些剩餘的樣板緩衝區內容會作為遮罩使用,以Alpha將大型、全圍的黑色四邊形混合到場景中。 使用樣板緩衝區做為遮罩,結果就是將陰影中的圖元變暗。

這表示每個光源會繪製陰影幾何兩次,因此對 GPU 的頂點輸送量施加壓力。 雙面樣板功能的設計是為了減輕這種情況。 在此方法中,有兩組樣板狀態(如下所示),一組分別針對正面三角形,另一組用於反向三角形。 如此一來,每個陰影磁碟區只會繪製單一傳遞,每個光線。

API 變更僅限於一組新的轉譯狀態。 新的轉譯狀態D3DRS_Two_Sided_StencilMODE可以設定為 TRUEFALSE。 默認為 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

樣板緩衝區技術

D3DRENDERSTATETYPE