Techniques de mémoire tampon de gabarit (Direct3D 9)

Les applications utilisent la mémoire tampon de gabarit pour masquer les pixels d’une image. Le masque contrôle si le pixel est dessiné ou non. Certains des effets les plus courants sont présentés ci-dessous.

La mémoire tampon de gabarit active ou désactive le dessin sur la surface cible de rendu pixel par pixel. À son niveau le plus fondamental, il permet aux applications de masquer les sections de l’image rendue afin qu’elles ne soient pas affichées. Les applications utilisent souvent des tampons de gabarit pour les effets spéciaux tels que les dissolutions, le décaltage et le plan.

Les informations de mémoire tampon de gabarit sont incorporées dans les données z-buffer. Votre application peut utiliser la méthode IDirect3D9::CheckDeviceFormat pour case activée pour la prise en charge du gabarit matériel, comme illustré dans l’exemple de code suivant.

// 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 vous permet de choisir un appareil à créer en fonction des fonctionnalités de cet appareil. Dans ce cas, les appareils qui ne prennent pas en charge les mémoires tampons de gabarit 8 bits sont rejetés. Notez qu’il ne s’agit que d’une utilisation possible pour IDirect3D9::CheckDeviceFormat ; Pour plus d’informations, consultez Détermination de la prise en charge matérielle (Direct3D 9).

Fonctionnement de la mémoire tampon de gabarit

Direct3D effectue un test sur le contenu de la mémoire tampon de gabarit pixel par pixel. Pour chaque pixel de la surface cible, il effectue un test à l’aide de la valeur correspondante dans la mémoire tampon de gabarit, d’une valeur de référence de gabarit et d’une valeur de masque de gabarit. Si le test réussit, Direct3D effectue une action. Le test est effectué en suivant les étapes suivantes.

  1. Effectuez une opération AND au niveau du bit de la valeur de référence de gabarit avec le masque de gabarit.
  2. Effectuez une opération AND au niveau du bit de la valeur de mémoire tampon de gabarit pour le pixel actuel avec le masque de gabarit.
  3. Comparez le résultat de l’étape 1 au résultat de l’étape 2, à l’aide de la fonction de comparaison.

Ces étapes sont illustrées dans l’exemple de code suivant.

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

est le contenu de la mémoire tampon de gabarit pour le pixel actuel. Cet exemple de code utilise le symbole esperluette (&) pour représenter l’opération AND au niveau du bit.

StencilMask

représente la valeur du masque de gabarit, et

StencilRef

représente la valeur de référence du gabarit.

CompFunc

est la fonction de comparaison.

Le pixel actuel est écrit sur la surface cible si le test de gabarit réussit. Sinon, il est ignoré. Le comportement de comparaison par défaut consiste à écrire le pixel, quelle que soit la façon dont chaque opération au niveau du bit se produit (D3DCMP_ALWAYS). Vous pouvez modifier ce comportement en modifiant la valeur de l’état de rendu D3DRS_STENCILFUNC, en passant un membre du type énuméré D3DCMPFUNC pour identifier la fonction de comparaison souhaitée.

Votre application peut personnaliser le fonctionnement de la mémoire tampon de gabarit. Il peut définir la fonction de comparaison, le masque de gabarit et la valeur de référence du gabarit. Il peut également contrôler l’action que Direct3D effectue lorsque le test de gabarit réussit ou échoue. Pour plus d’informations, consultez État de la mémoire tampon du gabarit (Direct3D 9).

Exemples

Les exemples de code suivants illustrent la configuration de la mémoire tampon de gabarit.

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

Par défaut, la valeur de référence du gabarit est zéro. Toute valeur entière est valide. Direct3D effectue un and au niveau du bit de la valeur de référence de gabarit et une valeur de masque de gabarit avant le test de gabarit.

Vous pouvez contrôler les informations de pixels écrites en fonction de la comparaison de gabarits.

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

Vous pouvez écrire votre propre formule pour la valeur que vous souhaitez écrire dans la mémoire tampon de gabarit, comme illustré dans l’exemple suivant.

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

Pipeline de pixels