Share via


樣板緩衝區技術 (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 會執行動作。 測試是使用下列步驟來執行。

  1. 使用樣板遮罩執行樣板參考值的位 AND 運算。
  2. 針對具有樣板遮罩的目前像素執行樣板緩衝區值的位 AND 運算。
  3. 使用比較函式,比較步驟 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))

圖元管線