Dela via


Stencilbufferttekniker (Direct3D 9)

Program använder stencilbufferten för att maskera bildpunkter i en bild. Masken styr om pixeln ritas eller inte. Några av de vanligaste effekterna visas nedan.

Stencilbufferten aktiverar eller inaktiverar ritning till målytan för återgivning på bildpunkt för bildpunkt. På den mest grundläggande nivån gör det möjligt för program att maskera delar av den renderade bilden så att de inte visas. Program använder ofta stencilbuffertar för specialeffekter som löses upp, avkalkning och beskriver.

Stencilbuffertinformationen är inbäddad i z-buffertdata. Ditt program kan använda metoden IDirect3D9::CheckDeviceFormat för att söka efter stöd för maskinvarustenciler, som du ser i följande kodexempel.

// 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 gör att du kan välja en enhet att skapa baserat på enhetens funktioner. I det här fallet avvisas enheter som inte stöder 8-bitars stencilbuffertar. Observera att detta bara är en möjlig användning för IDirect3D9::CheckDeviceFormat; Mer information finns i Fastställa maskinvarustöd (Direct3D 9).

Så här fungerar stencilbufferten

Direct3D utför ett test på innehållet i stencilbufferten pixel för bildpunkt. För varje pixel i målytan utför den ett test med motsvarande värde i stencilbufferten, ett stencilreferensvärde och ett stencilmaskvärde. Om testet godkänns utför Direct3D en åtgärd. Testet utförs med hjälp av följande steg.

  1. Utför en bitvis AND-åtgärd av stencilreferensvärdet med stencilmasken.
  2. Utför en bitvis AND-åtgärd av stencilbuffertvärdet för den aktuella pixeln med stencilmasken.
  3. Jämför resultatet av steg 1 med resultatet av steg 2 med hjälp av jämförelsefunktionen.

De här stegen visas i följande kodexempel.

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

är innehållet i stencilbufferten för den aktuella pixeln. I det här kodexemplet används symbolen ampersand (&) för att representera bitvis AND-åtgärden.

StencilMask

representerar värdet för stencilmasken, och

StencilRef

representerar stencilreferensvärdet.

CompFunc

är jämförelsefunktionen.

Den aktuella pixeln skrivs till målytan om stenciltestet godkänns och ignoreras annars. Standardjämförelsebeteendet är att skriva pixeln, oavsett hur varje bitvis åtgärd blir (D3DCMP_ALWAYS). Du kan ändra det här beteendet genom att ändra värdet för D3DRS_STENCILFUNC återgivningstillstånd och skicka en medlem av den D3DCMPFUNC uppräknade typen för att identifiera önskad jämförelsefunktion.

Ditt program kan anpassa stencilbuffertens drift. Den kan ange jämförelsefunktionen, stencilmasken och stencilreferensvärdet. Den kan också styra den åtgärd som Direct3D vidtar när stenciltestet godkänns eller misslyckas. Mer information finns i stencilbufferttillstånd (Direct3D 9).

Exempel

Följande kodexempel visar hur du konfigurerar stencilbufferten.

// 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);

Som standard är stencilreferensvärdet noll. Alla heltalsvärden är giltiga. Direct3D utför ett bitvis OCH av stencilreferensvärdet och ett stencilmaskvärde före stenciltestet.

Du kan styra vilken pixelinformation som skrivs ut beroende på stenciljämförelsen.

// 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);

Du kan skriva en egen formel för det värde som du vill skriva till stencilbufferten enligt följande exempel.

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

Pixel Pipeline