樣板緩衝區技術 (Direct3D 9)
應用程式會使用樣板緩衝區來遮罩影像中的圖元。 遮罩會控制是否繪製圖元。 以下顯示一些較常見的效果。
樣板緩衝區會啟用或停用以像素為基礎繪製至轉譯目標介面的繪圖。 在最基本的層級,它可讓應用程式遮罩轉譯影像的區段,使其不會顯示。 應用程式通常會使用樣板緩衝區進行特殊效果,例如溶解、貼紙和大綱。
樣板緩衝區資訊內嵌在 z 緩衝區數據中。 您的應用程式可以使用 IDirect3D9::CheckDeviceFormat 方法來檢查硬體樣板支援,如下列程式代碼範例所示。
// Reject devices that cannot perform 8-bit stencil buffering.
// The following example assumes that pCaps is a valid pointer
// to an initialized D3DCAPS9 structure.
if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
pCaps->DeviceType,
Format,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
D3DFMT_D24S8 ) ) )
return E_FAIL;
IDirect3D9::CheckDeviceFormat 可讓您根據該裝置的功能選擇要建立的裝置。 在此情況下,不支援 8 位樣板緩衝區的裝置會遭到拒絕。 請注意,這隻可用於 IDirect3D9::CheckDeviceFormat;如需詳細資訊,請參閱 判斷硬體支援 (Direct3D 9) 。
樣板緩衝區的運作方式
Direct3D 會以像素為基礎,對樣板緩衝區的內容執行測試。 針對目標介面中的每個圖元,它會使用樣板緩衝區中的對應值、樣板參考值和樣板遮罩值來執行測試。 如果測試通過,Direct3D 會執行動作。 測試是使用下列步驟來執行。
- 使用樣板遮罩執行樣板參考值的位 AND 運算。
- 針對具有樣板遮罩的目前像素執行樣板緩衝區值的位 AND 運算。
- 使用比較函式,比較步驟 1 的結果與步驟 2 的結果。
下列步驟會顯示在下列程式代碼範例中。
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue
是目前圖元之樣板緩衝區的內容。 此程式代碼範例會使用 ampersand (&) 符號來表示位 AND 作業。
StencilMask
表示樣板遮罩的值,以及
StencilRef
表示樣板參考值。
CompFunc
是比較函式。
如果樣板測試通過,則目前的圖元會寫入目標表面,否則會忽略。 默認的比較行為是寫入圖元,無論每個位運算的結果為何(D3DCMP_ALWAYS)。 您可以變更D3DRS_STENCILFUNC轉譯狀態的值,傳遞D3DCMPFUNC列舉型別的成員,以識別所需的比較函式,藉以變更此行為。
您的應用程式可以自定義樣板緩衝區的作業。 它可以設定比較函式、樣板遮罩和樣板參考值。 它也可以控制 Direct3D 在樣板測試通過或失敗時所採取動作。 如需詳細資訊,請參閱樣板緩衝區狀態(Direct3D 9)。
範例
下列程式代碼範例示範如何設定樣板緩衝區。
// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);
// Specify a stencil mask
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);
根據預設,樣板參考值為零。 任何整數值都是有效的。 Direct3D 會在樣板測試之前執行樣板參考值的位 AND 和樣板遮罩值。
您可以根據樣板比較來控制要寫出哪些像素資訊。
// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
您可以針對您想要寫入樣板緩衝區的值撰寫自己的公式,如下列範例所示。
NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) |
(StencilWriteMask & StencilOp(StencilBufferValue))
相關主題