Delen via


Stencilbuffertechnieken (Direct3D 9)

Toepassingen gebruiken de stencilbuffer om pixels in een afbeelding te maskeren. Het masker bepaalt of de pixel al dan niet wordt getekend. Hieronder ziet u enkele van de meest voorkomende effecten.

Met de stencilbuffer kunt u tekenen op pixel-voor-pixelbasis naar het weergavedoeloppervlak in- of uitschakelen. Op het meest fundamentele niveau kunnen toepassingen secties van de gerenderde afbeelding maskeren, zodat ze niet worden weergegeven. Toepassingen gebruiken vaak stencilbuffers voor speciale effecten, zoals oplossen, schaalaanpassing en overzicht.

Stencilbuffergegevens worden ingesloten in de z-buffergegevens. Uw toepassing kan de methode IDirect3D9::CheckDeviceFormat gebruiken om te controleren op ondersteuning van hardwarestencils, zoals wordt weergegeven in het volgende codevoorbeeld.

// 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 kunt u een apparaat kiezen dat moet worden gemaakt op basis van de mogelijkheden van dat apparaat. In dit geval worden apparaten die geen 8-bits stencilbuffers ondersteunen, geweigerd. Houd er rekening mee dat dit slechts één mogelijk gebruik is voor IDirect3D9::CheckDeviceFormat; Zie Hardwareondersteuning (Direct3D 9)bepalen voor meer informatie.

Hoe de stencilbuffer werkt

Direct3D voert een test uit op de inhoud van de stencilbuffer op pixelbasis. Voor elke pixel in het doeloppervlak wordt een test uitgevoerd met behulp van de bijbehorende waarde in de stencilbuffer, een stencilreferentiewaarde en een stencilmaskerwaarde. Als de test is geslaagd, voert Direct3D een actie uit. De test wordt uitgevoerd met behulp van de volgende stappen.

  1. Voer een bitsgewijze AND-bewerking uit van de stencilreferentiewaarde met het stencilmasker.
  2. Voer een bitsgewijze AND-bewerking uit van de bufferwaarde van het stencil voor de huidige pixel met het stencilmasker.
  3. Vergelijk het resultaat van stap 1 met het resultaat van stap 2, met behulp van de vergelijkingsfunctie.

Deze stappen worden weergegeven in het volgende codevoorbeeld.

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

is de inhoud van de stencilbuffer voor de huidige pixel. In dit codevoorbeeld wordt het teken ampersand (&) gebruikt om de bitsgewijze AND-bewerking weer te geven.

StencilMask

vertegenwoordigt de waarde van het stencilmasker en

StencilRef

vertegenwoordigt de stencilreferentiewaarde.

CompFunc

is de vergelijkingsfunctie.

De huidige pixel wordt naar het doeloppervlak geschreven als het stencil wordt getest en anders wordt genegeerd. Het standaardvergelijkingsgedrag is het schrijven van de pixel, ongeacht hoe elke bitsgewijze bewerking wordt weergegeven (D3DCMP_ALWAYS). U kunt dit gedrag wijzigen door de waarde van de D3DRS_STENCILFUNC weergavestatus te wijzigen, waarbij een lid van het D3DCMPFUNC geïnventariseerd type wordt doorgegeven om de gewenste vergelijkingsfunctie te identificeren.

Uw toepassing kan de werking van de stencilbuffer aanpassen. Hiermee kunt u de vergelijkingsfunctie, het stencilmasker en de stencilverwijzingswaarde instellen. Het kan ook bepalen welke actie Direct3D uitvoert wanneer de stenciltest is geslaagd of mislukt. Zie Stencil bufferstatus (Direct3D 9)voor meer informatie.

Voorbeelden

In de volgende codevoorbeelden ziet u hoe u de stencilbuffer instelt.

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

Standaard is de stencilreferentiewaarde nul. Elke waarde voor een geheel getal is geldig. Direct3D voert een bitwise AND van de stencilreferentiewaarde en een stencilmaskerwaarde uit vóór de stenciltest.

U kunt bepalen welke pixelgegevens worden geschreven, afhankelijk van de vergelijking van het 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);

U kunt uw eigen formule schrijven voor de waarde die u in de stencilbuffer wilt schrijven, zoals wordt weergegeven in het volgende voorbeeld.

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

Pixel Pipeline-