Schablonenpuffertechniken (Direct3D 9)
Anwendungen verwenden den Schablonenpuffer, um Pixel in einem Bild zu maskieren. Die Maske steuert, ob das Pixel gezeichnet wird. Einige der häufigeren Auswirkungen sind unten dargestellt.
- Compositing
- Dekalierung
- Verwischen, Ausblenden und Wischen
- Gliederungen und Gliederungen
- Zweiseitige Schablone
Der Schablonenpuffer aktiviert oder deaktiviert das Pixel-für-Pixel-Zeichnen auf der Renderingzieloberfläche. Auf der grundlegendsten Ebene können Anwendungen Abschnitte des gerenderten Bilds maskieren, sodass sie nicht angezeigt werden. Anwendungen verwenden häufig Schablonenpuffer für sonderliche Effekte wie z. B. Abschärfungen, Dekalierung und Lining.
Schablonenpufferinformationen werden in die Z-Buffer-Daten eingebettet. Ihre Anwendung kann die IDirect3D9::CheckDeviceFormat-Methode verwenden, um die Hardware-Schablonenunterstü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;
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 abgelehnt, die keine 8-Bit-Schablonenpuffer unterstützen. Beachten Sie, dass dies nur eine mögliche Verwendung für IDirect3D9::CheckDeviceFormat ist. Weitere Informationen finden Sie unter Bestimmen der Hardwareunterstützung (Direct3D 9).
Funktionsweise des Schablonenpuffers
Direct3D führt einen Pixel-für-Pixel-Test des Inhalts des Schablonenpuffers durch. Für jedes Pixel auf der Zieloberfläche wird ein Test mit dem entsprechenden Wert im Schablonenpuffer, einem Schablonenverweiswert und einem Schablonenmaskenwert durchgeführt. Wenn der Test bestanden wird, führt Direct3D eine Aktion aus. Der Test wird mit den folgenden Schritten ausgeführt.
- Führen Sie eine bitweise AND-Operation des Schablonenverweiswerts mit der Schablonenmaske aus.
- Führen Sie eine bitweise AND-Operation des Schablonenpufferwerts für das aktuelle Pixel mit der Schablonenmaske aus.
- 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 ampersand-Symbol (&) verwendet, um die bitweise AND-Operation zu darstellen.
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 bestanden wird, andernfalls wird es ignoriert. Das Standardvergleichsverhalten besteht im Schreiben des Pixels, unabhängig davon, wie jede bitweise Operation aus fällt (D3DCMP _ ALWAYS). Sie können dieses Verhalten ändern, indem Sie den Wert des D3DRS STENCILFUNC-Renderzustands ändern und einen Member des _ aufzählten D3DCMPFUNC-Typs übergeben, um die gewünschte Vergleichsfunktion zu identifizieren.
Ihre Anwendung kann den Betrieb des Schablonenpuffers anpassen. Sie kann die Vergleichsfunktion, die Schablonenmaske und den Schablonenverweiswert festlegen. Sie kann auch die Aktion steuern, die Direct3D vorgibt, wenn der Schablonentest bestanden 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 0 (null). Ein ganzzahliger Wert ist gültig. Direct3D führt vor dem Schablonentest ein bitweises AND des Schablonenverweiswerts und einen Schablonenmaskenwert aus.
Sie können abhängig vom Schablonenvergleich 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 ihre 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))