Tecniche di buffer stencil (Direct3D 9)

Le applicazioni usano il buffer degli stencil per mascherare i pixel in un'immagine. La maschera controlla se il pixel viene disegnato o meno. Di seguito sono riportati alcuni degli effetti più comuni.

Il buffer degli stencil abilita o disabilita il disegno sulla superficie di destinazione di rendering su base pixel per pixel. Al livello più fondamentale, consente alle applicazioni di mascherare le sezioni dell'immagine sottoposta a rendering in modo che non vengano visualizzate. Le applicazioni usano spesso buffer di stencil per effetti speciali, ad esempio dissolvenza, decaling e struttura.

Le informazioni sul buffer degli stencil sono incorporate nei dati del buffer z. L'applicazione può usare il metodo IDirect3D9::CheckDeviceFormat per verificare il supporto degli stencil hardware, come illustrato nell'esempio di codice seguente.

// 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 consente di scegliere un dispositivo da creare in base alle funzionalità del dispositivo. In questo caso, i dispositivi che non supportano buffer stencil a 8 bit vengono rifiutati. Si noti che questo è solo un possibile uso per IDirect3D9::CheckDeviceFormat. Per informazioni dettagliate, vedere Determinazione del supporto hardware (Direct3D 9).

Funzionamento del buffer Stencil

Direct3D esegue un test sul contenuto del buffer degli stencil su base pixel per pixel. Per ogni pixel nella superficie di destinazione, esegue un test usando il valore corrispondente nel buffer degli stencil, un valore di riferimento dello stencil e un valore di maschera stencil. Se il test viene superato, Direct3D esegue un'azione. Il test viene eseguito seguendo questa procedura.

  1. Eseguire un'operazione AND bit per bit del valore di riferimento dello stencil con la maschera stencil.
  2. Eseguire un'operazione AND bit per bit del valore del buffer degli stencil per il pixel corrente con la maschera stencil.
  3. Confrontare il risultato del passaggio 1 con il risultato del passaggio 2, usando la funzione di confronto.

Questi passaggi sono illustrati nell'esempio di codice seguente.

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

è il contenuto del buffer degli stencil per il pixel corrente. In questo esempio di codice viene utilizzato il simbolo e commerciale (&) per rappresentare l'operazione AND bit per bit.

StencilMask

rappresenta il valore della maschera stencil e

StencilRef

rappresenta il valore di riferimento dello stencil.

CompFunc

è la funzione di confronto.

Il pixel corrente viene scritto nella superficie di destinazione se il test dello stencil supera e viene ignorato in caso contrario. Il comportamento di confronto predefinito consiste nel scrivere il pixel, indipendentemente dal modo in cui viene eseguita ogni operazione bit per bit (D3DCMP_ALWAYS). È possibile modificare questo comportamento modificando il valore del D3DRS_STENCILFUNC stato di rendering, passando un membro del tipo enumerato D3DCMPFUNC per identificare la funzione di confronto desiderata.

L'applicazione può personalizzare il funzionamento del buffer degli stencil. Può impostare la funzione di confronto, la maschera stencil e il valore di riferimento dello stencil. Può anche controllare l'azione eseguita da Direct3D quando il test dello stencil supera o non riesce. Per altre informazioni, vedere Stencil Buffer State (Direct3D 9).

Esempi

Gli esempi di codice seguenti illustrano la configurazione del buffer degli stencil.

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

Per impostazione predefinita, il valore di riferimento dello stencil è zero. Qualsiasi valore intero è valido. Direct3D esegue un and bit per bit del valore di riferimento dello stencil e un valore maschera stencil prima del test dello stencil.

È possibile controllare le informazioni sui pixel scritte in base al confronto degli stencil.

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

È possibile scrivere una formula personalizzata per il valore che si desidera scrivere nel buffer degli stencil, come illustrato nell'esempio seguente.

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

Pixel Pipeline