Partager via


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 l’aire cible de rendu sur une base de pixel par pixel. Au 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 mémoires tampons de gabarit pour des effets spéciaux tels que les dissolutions, la mise à l’échelle 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 vérifier 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 s’agit d’une seule 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 sur une base de pixels par pixels. 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é à l’aide des étapes suivantes.

  1. Effectuez une opération AND au niveau du bit de la valeur de référence du gabarit avec le masque de gabarit.
  2. Effectuez une opération AND au niveau du bit de la valeur de la 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 présenté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 ampersand (&) 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 et est ignoré sinon. 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 s’avère (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 l’opération 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 effectuée par Direct3D lorsque le test de gabarit réussit ou échoue. Pour plus d’informations, consultez 'état de 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 égale à zéro. Toute valeur entière est valide. Direct3D effectue une opération AND au niveau du bit de la valeur de référence du 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))

de pipeline de pixels