Schablonenpuffertechniken (Direct3D 9)

Anwendungen verwenden den Schablonenpuffer, um Pixel in einem Bild zu maskieren. Die Maske steuert, ob das Pixel gezeichnet wird oder nicht. Einige der häufigeren Effekte sind unten dargestellt.

Der Schablonenpuffer aktiviert oder deaktiviert das Zeichnen auf die Renderingzieloberfläche pixelweise. Auf der grundlegendsten Ebene ermöglicht es Anwendungen, Abschnitte des gerenderten Bilds so zu maskieren, dass sie nicht angezeigt werden. Anwendungen verwenden häufig Schablonenpuffer für Spezialeffekte wie Auflösungen, Decaling und Gliederungen.

Schablonenpufferinformationen werden in die Z-Pufferdaten eingebettet. Ihre Anwendung kann die IDirect3D9::CheckDeviceFormat-Methode verwenden, um die Unterstützung von Hardwareschablonen zu überprüfen, wie im folgenden Codebeispiel gezeigt.

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

Mit IDirect3D9::CheckDeviceFormat können Sie ein Gerät auswählen, das basierend auf den Funktionen dieses Geräts erstellt werden soll. In diesem Fall werden Geräte, die keine 8-Bit-Schablonenpuffer unterstützen, abgelehnt. Beachten Sie, dass dies nur eine mögliche Verwendung für IDirect3D9::CheckDeviceFormat ist. Weitere Informationen finden Sie unter Ermitteln der Hardwareunterstützung (Direct3D 9).

Funktionsweise des Schablonenpuffers

Direct3D führt pixelweise einen Test für den Inhalt des Schablonenpuffers durch. Für jedes Pixel auf der Zieloberfläche wird ein Test mit dem entsprechenden Wert im Schablonenpuffer, einem Schablonenverweiswert und einem Schablonenformatwert durchgeführt. Wenn der Test erfolgreich ist, führt Direct3D eine Aktion aus. Der Test wird mit den folgenden Schritten durchgeführt.

  1. Führen Sie eine bitweise AND-Operation des Schablonenverweiswerts mit der Schablonenmaske aus.
  2. Führen Sie einen bitweisen AND-Vorgang des Schablonenpufferwerts für das aktuelle Pixel mit der Schablonenmaske aus.
  3. Vergleichen Sie das Ergebnis von Schritt 1 mit dem Ergebnis von Schritt 2, indem Sie die Vergleichsfunktion verwenden.

Diese Schritte werden im folgenden Codebeispiel gezeigt.

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

ist der Inhalt des Schablonenpuffers für das aktuelle Pixel. In diesem Codebeispiel wird das Symbol amper und (&) verwendet, um den bitweisen AND-Vorgang darzustellen.

StencilMask

stellt den Wert der Schablonenmaske dar, und

StencilRef

stellt den Schablonenverweiswert dar.

CompFunc

ist die Vergleichsfunktion.

Das aktuelle Pixel wird auf die Zieloberfläche geschrieben, wenn der Schablonentest erfolgreich ist, und wird andernfalls ignoriert. Das Standardvergleichsverhalten besteht darin, das Pixel zu schreiben, unabhängig davon, wie jeder bitweise Vorgang ausfällt (D3DCMP_ALWAYS). Sie können dieses Verhalten ändern, indem Sie den Wert des D3DRS_STENCILFUNC Renderzustands ändern und einen Member des aufgezählten D3DCMPFUNC-Typs übergeben, um die gewünschte Vergleichsfunktion zu identifizieren.

Ihre Anwendung kann den Betrieb des Schablonenpuffers anpassen. Sie können die Vergleichsfunktion, die Schablonenmaske und den Schablonenverweiswert festlegen. Es kann auch die Aktion steuern, die Direct3D ausführt, wenn der Schablonentest erfolgreich ist oder fehlschlägt. Weitere Informationen finden Sie unter Schablonenpufferzustand (Direct3D 9).

Beispiele

Die folgenden Codebeispiele veranschaulichen das Einrichten des Schablonenpuffers.

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

Standardmäßig ist der Schablonenverweiswert null. Jeder ganzzahlige Wert ist gültig. Direct3D führt vor dem Schablonentest ein bitweises AND des Schablonenverweiswerts und eines Schablonenformatwerts aus.

Je nach Schablonenvergleich können Sie steuern, welche Pixelinformationen ausgeschrieben werden.

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

Sie können eine eigene Formel für den Wert schreiben, den Sie in den Schablonenpuffer schreiben möchten, wie im folgenden Beispiel gezeigt.

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

Pixelpipeline