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.
- A rajzsablon referenciaértékének bitenkénti ÉS művelete a rajzsablon maszkkal.
- A rajzsablon pufferértékének bitenkénti ÉS műveletet kell végrehajtania az aktuális képponthoz a rajzsablon maszkjával.
- 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))
Kapcsolódó témakörök