Megosztás a következőn keresztül:


Rajzsablonpuffer technikák (Direct3D 9)

Az alkalmazások a rajzsablon pufferével maszkolják a képek képpontjait. A maszk határozza meg, hogy a képpont rajzolva van-e. Az alábbiakban néhány gyakori hatás látható.

A rajzsablon puffere képpontonként engedélyezi vagy letiltja a rajzolást a renderelési célfelületre. A legalapvetőbb szinten lehetővé teszi az alkalmazások számára a renderelt kép szakaszainak maszkolását, hogy ne jelenjenek meg. Az alkalmazások gyakran használnak rajzsablonpuffereket speciális effektusokhoz, például oldáshoz, skálázáshoz és kibontáshoz.

A rajzsablon pufferadatai a z-pufferadatokba ágyazódnak be. Az alkalmazás a IDirect3D9::CheckDeviceFormat metódust használhatja a hardversablon támogatásának ellenőrzéséhez, ahogyan az alábbi kód példában látható.

// 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 lehetővé teszi az eszköz képességei alapján létrehozni kívánt eszköz kiválasztását. Ebben az esetben a rendszer elutasítja a 8 bites rajzsablonpuffereket nem támogató eszközöket. Vegye figyelembe, hogy ez csak egy lehetséges használata IDirect3D9::CheckDeviceFormat; további részletekért lásd: Hardvertámogatás (Direct3D 9).

A rajzsablonpuffer működése

A Direct3D képpontonként végzi el a rajzsablon pufferének tartalmát. A célfelület minden egyes képpontja esetében elvégzi a tesztet a rajzsablon pufferének megfelelő értékével, egy rajzsablon-referenciaértékkel és egy rajzsablonmaszk értékével. Ha a teszt sikeres, a Direct3D végrehajt egy műveletet. A teszt az alábbi lépések végrehajtásával történik.

  1. A rajzsablon referenciaértékének bitenkénti ÉS művelete a rajzsablon maszkkal.
  2. A rajzsablon pufferértékének bitenkénti ÉS műveletet kell végrehajtania az aktuális képponthoz a rajzsablon maszkjával.
  3. Hasonlítsa össze az 1. lépés eredményét a 2. lépés eredményével az összehasonlító függvény használatával.

Ezek a lépések a következő kód példában láthatók.

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

az aktuális képpont rajzsablonpufferének tartalma. Ez a példakód az ampersand (&) szimbólumot használja a bitenkénti ÉS művelet megjelenítéséhez.

StencilMask

a rajzsablon maszkjának értékét jelöli, és

StencilRef

a rajzsablon referenciaértékét jelöli.

CompFunc

az összehasonlító függvény.

Az aktuális képpontot a rendszer a célfelületre írja, ha a rajzsablon tesztje megfelel, és ellenkező esetben figyelmen kívül hagyja. Az alapértelmezett összehasonlítási viselkedés a képpont írása, függetlenül attól, hogy az egyes bitenkénti műveletek hogyan alakulnak ki (D3DCMP_ALWAYS). Ezt a viselkedést a D3DRS_STENCILFUNC renderelési állapot értékének módosításával módosíthatja, és a D3DCMPFUNC számbavételi típus egyik tagját átadva azonosíthatja a kívánt összehasonlító függvényt.

Az alkalmazás testre szabhatja a rajzsablon pufferének működését. Beállíthatja az összehasonlító függvényt, a rajzsablon maszkját és a rajzsablon referenciaértékét. Azt is szabályozhatja, hogy a Direct3D milyen műveletet hajt végre, amikor a rajzsablon tesztje sikeres vagy sikertelen lesz. További információ: rajzsablon pufferállapota (Direct3D 9).

Példák

Az alábbi példakód a rajzsablon pufferének beállítását mutatja be.

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

Alapértelmezés szerint a rajzsablon referenciaértéke nulla. Minden egész szám értéke érvényes. A Direct3D bitenkénti ÉS a rajzsablon referenciaértékét és egy rajzsablonmaszk-értéket hajt végre a rajzsablonteszt előtt.

A rajzsablon összehasonlításától függően szabályozhatja, hogy milyen képpontinformációk írhatók ki.

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

Az alábbi példában látható módon saját képletet írhat a rajzsablon pufferébe írni kívánt értékhez.

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

Pixel Pipeline