Freigeben über


Two-Sided Schablone (Direct3D 9)

Schattenvolumes werden zum Zeichnen von Schatten mit dem Schablonenpuffer verwendet. Die Anwendung berechnet die Schattenvolumen, die durch verdeckende Geometrie gegossen werden, indem die Silhouettenränder berechnet und von dem Licht weg in eine Reihe von 3D-Volumes projiziert werden. Diese Volumes werden dann zweimal im Schablonenpuffer gerendert.

Das erste Rendern zeichnet vorwärtsgerichtete Polygone und erhöht die Schablonenpufferwerte. Das zweite Rendern zeichnet die zurückgerichteten Polygone des Schattenvolumens und erhöht die Schablonenpufferwerte. Normalerweise brechen alle inkrementierten und dekrementierten Werte einander ab. Die Szene wurde jedoch bereits mit normaler Geometrie gerendert, sodass einige Pixel beim Rendern des Schattenvolumens den Z-Puffertest fehlschlagen. Werte, die im Schablonenpuffer verbleiben, entsprechen Pixeln, die sich im Schatten befinden. Diese verbleibenden Schablonenpufferinhalte werden als Maske verwendet, um ein großes, allumfassendes schwarzes Quad in die Szene zu mischen. Wenn der Schablonenpuffer als Maske fungiert, besteht das Ergebnis darin, Pixel abzudunkelt, die sich in den Schatten befinden.

Dies bedeutet, dass die Schattengeometrie zweimal pro Lichtquelle gezeichnet wird und somit Druck auf den Vertexdurchsatz der GPU setzt. Das zweiseitige Schablonenfeature wurde entwickelt, um diese Situation zu mindern. Bei diesem Ansatz gibt es zwei Gruppen von Schablonenzustand (benannt unten), eine gruppe für die dreieckigen Dreiecke und die andere für die nach hinten gerichteten Dreiecke. Auf diese Weise wird pro Schattenvolumen nur ein einzelner Durchlauf pro Licht gezeichnet.

Die API-Änderungen sind auf einen neuen Satz von Renderzuständen beschränkt. Der neue Renderzustand D3DRS_Two_Sided_StencilMODE kann auf TRUE oder FALSE-festgelegt werden. Es ist standardmäßig FALSE-, d. h. aktuelles Verhalten (DirectX 8). Wenn dies auf TRUE- festgelegt ist (es funktioniert nur, wenn D3DSTENCILCAPS_TWOSIDED festgelegt ist), gelten die folgenden Renderzustände nur für die im Vordergrund gerichteten Dreiecke (im Uhrzeigersinn).

Renderzustand Beschreibung
D3DRS_STENCILFAIL D3DSTENCILOP ausführen, wenn der Schablonentest fehlschlägt.
D3DRS_STENCILZFAIL D3DSTENCILOP, um zu tun, wenn der Schablonentest erfolgreich ist und Z-Test fehlschlägt.
D3DRS_STENCILPASS D3DSTENCILOP ausführen, wenn sowohl Schablonen- als auch Z-Tests bestehen.
D3DRS_STENCILFUNC D3DCMPFUNC fn. Der Schablonentest ist erfolgreich, wenn (Ref & Mask) Schablonen (Schablone & Maske)) "true" ist.

 

Eine neue Gruppe von Renderzuständen gilt für die umgekehrten Dreiecke (gegen den Uhrzeigersinn).

Renderzustand Beschreibung
D3DRS_CCW_STENCILFAIL D3DSTENCILOP ausführen, wenn der Schablonentest fehlschlägt.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP, um zu tun, wenn der Schablonentest erfolgreich ist und Z-Test fehlschlägt.
D3DRS_CCW_STENCILPASS D3DSTENCILOP ausführen, wenn sowohl Schablonen- als auch Z-Tests bestehen.
D3DRS_CCW_STENCILFUNC D3DCMPFUNC-Funktion. Der Schablonentest besteht, wenn ((Ref & Mask) Schablonen (Schablone & Maske)) "true" ist.

 

Die verbleibenden Schablonenrenderungszustände gelten immer für Dreiecke im Uhrzeigersinn und gegen den Uhrzeigersinn.

D3DRS_Two_Sided_StencilMODE wird für Linien- und Punktspites ignoriert, was bedeutet, dass das Verhalten von DirectX 8 unverändert ist. Die D3DRS_CCW_STENCIL*-Renderzustände werden ignoriert.

Ein neues Kapitälchen gibt an, ob das Gerät dieses Feature unterstützt. Treiber, die dieses Feature nicht unterstützen, werden diese neuen Renderzustände ignorieren. Alle anderen Schablonen-Kapitälchenbits gelten für beide Modi der Schablonenpufferung. Da Two_Sided_Stencil die Möglichkeit zum Zeichnen mit D3DCULLMODE_NONE impliziert, muss die entsprechende Kappe vom Treiber festgelegt werden, wenn sie diesen neuen Schablonenmodus unterstützt. Microsoft Windows Hardware Quality Labs (WHQL) sollte dies erzwingen.

Neue Renderzustände:

D3DRS_Two_Sided_StencilMODE // BOOL (default is FALSE)
D3DRS_CCW_STENCILFAIL     // Same default as D3DRS_STENCILFAIL
D3DRS_CCW_STENCILZFAIL    // Same default as D3DRS_STENCILZFAIL
D3DRS_CCW_STENCILPASS     // Same default as D3DRS_STENCILPASS
D3DRS_CCW_STENCILFUNC     // Same default as D3DRS_STENCILFUNC

Neue Obergrenze:

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

Schablonenpuffertechniken

D3DRENDERSTATETYPE