Freigeben über


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 werden unten gezeigt.

Der Schablonenpuffer aktiviert oder deaktiviert die Zeichnung auf die Renderzieloberfläche auf Pixelbasis. Auf seiner grundlegendsten Ebene ermöglicht es Anwendungen, Abschnitte des gerenderten Bilds zu maskieren, sodass sie nicht angezeigt werden. Anwendungen verwenden häufig Schablonenpuffer für Spezialeffekte wie Auflösungen, Dekalierung und Gliederung.

Schablonenpufferinformationen werden in die Z-Pufferdaten eingebettet. Ihre Anwendung kann die IDirect3D9::CheckDeviceFormat Methode verwenden, um die Hardwareschablonenunterstützung 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;

IDirect3D9::CheckDeviceFormat ermöglicht Es Ihnen, ein Gerät auszuwä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::CheckDeviceFormatist; Weitere Informationen finden Sie unter Ermitteln der Hardwareunterstützung (Direct3D 9).

Funktionsweise des Schablonenpuffers

Direct3D führt einen Test für den Inhalt des Schablonenpuffers auf Pixelbasis 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 einen bitweisen AND-Vorgang des Schablonenverweiswerts mit dem Schablonenformat aus.
  2. Führen Sie einen bitweisen AND-Vorgang des Schablonenpufferwerts für das aktuelle Pixel mit dem Schablonenformat aus.
  3. Vergleichen Sie das Ergebnis von Schritt 1 mit dem Ergebnis von Schritt 2 mithilfe der Vergleichsfunktion.

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 kaufmännische Und-Zeichen (&) verwendet, um den bitweisen AND-Vorgang darzustellen.

StencilMask

stellt den Wert des Schablonenformats 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 andernfalls ignoriert wird. Das Standardvergleichsverhalten besteht darin, das Pixel zu schreiben, unabhängig davon, wie sich jeder bitweise Vorgang herausstellt (D3DCMP_ALWAYS). Sie können dieses Verhalten ändern, indem Sie den Wert des D3DRS_STENCILFUNC Renderzustands ändern und ein Element des D3DCMPFUNC aufgezählten Typs übergeben, um die gewünschte Vergleichsfunktion zu identifizieren.

Ihre Anwendung kann den Vorgang des Schablonenpuffers anpassen. Sie kann die Vergleichsfunktion, das Schablonenformat und den Schablonenverweiswert festlegen. Sie kann auch die Aktion steuern, die Direct3D ausführt, wenn der Schablonentest erfolgreich ist oder fehlschlägt. Weitere Informationen finden Sie unter Schablonenpufferstatus (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. Ein ganzzahliger Wert ist gültig. Direct3D führt einen bitweisen AND des Schablonenverweiswerts und einen Schablonenformatwert vor dem Schablonentest aus.

Sie können steuern, welche Pixelinformationen je nach Schablonenvergleich geschrieben 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-