Freigeben über


Two-Sided Schablone (Direct3D 9)

Schattenvolumes werden zum Zeichnen von Schatten mit dem Schablonenpuffer verwendet. Die Anwendung berechnet die Schattenvolumina, die durch Verschließen der Geometrie, durch Berechnung der Silhouettenränder und extrudiert sie aus dem Licht in eine Reihe von 3D-Volumes. Diese Volumes werden dann zweimal in den Schablonenpuffer gerendert.

Das erste Rendern zeichnet nach vorne ausgerichtete Polygone und erhöht die Schablonenpufferwerte. Das zweite Rendern zeichnet die nach hinten gerichteten Polygone des Schattenvolumens und dekrementiert die Schablonenpufferwerte. Normalerweise heben sich alle inkrementierten und dekrementierten Werte gegenseitig ab. Die Szene wurde jedoch bereits mit normaler Geometrie gerendert, sodass einige Pixel beim Z-Puffertest fehlschlagen, wenn das Schattenvolumen gerendert wird. 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 überblenden. Wenn der Schablonenpuffer als Maske fungiert, wird das Ergebnis dazu führen, dass Die Pixel, die sich in den Schatten befinden, abdunkle.

Dies bedeutet, dass die Schattengeometrie zweimal pro Lichtquelle gezeichnet wird, wodurch der Vertexdurchsatz der GPU belastet wird. Die zweiseitige Schablonenfunktion wurde entwickelt, um diese Situation zu entschärfen. Bei diesem Ansatz gibt es zwei Sätze des Schablonenzustands (benannt unten), jeweils einen Satz für die nach vorne gerichteten Dreiecke und die andere für die nach hinten gerichteten Dreiecke. Auf diese Weise wird nur ein einzelner Durchgang pro Schattenvolumen und 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 , was das aktuelle Verhalten (DirectX 8) bedeutet. Wenn dies auf TRUE festgelegt ist (funktioniert nur, wenn D3DSTENCILCAPS_TWOSIDED festgelegt ist), gelten die folgenden Renderzustände nur für die nach vorne gerichteten Dreiecke (im Uhrzeigersinn).

Renderzustand Beschreibung
D3DRS_STENCILFAIL D3DSTENCILOP, wenn der Schablonentest fehlschlägt.
D3DRS_STENCILZFAIL D3DSTENCILOP, wenn schablonentest bestanden und z-test fehlschlägt.
D3DRS_STENCILPASS D3DSTENCILOP, wenn sowohl schablonen als auch z-tests erfolgreich sind.
D3DRS_STENCILFUNC D3DCMPFUNC fn. Schablonentest besteht, wenn ((ref & mask) stencilfn (Schablonenmaske & )) true ist.

 

Ein neuer Satz von Renderzuständen gilt für die nach hinten gerichteten Dreiecke (gegen den Uhrzeigersinn).

Renderzustand Beschreibung
D3DRS_CCW_STENCILFAIL D3DSTENCILOP, wenn der Schablonentest fehlschlägt.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP, wenn schablonentest bestanden und z-test fehlschlägt.
D3DRS_CCW_STENCILPASS D3DSTENCILOP, wenn sowohl schablonen als auch z-tests erfolgreich sind.
D3DRS_CCW_STENCILFUNC D3DCMPFUNC-Funktion. Schablonentest besteht, wenn ((ref & mask) stencilfn (Schablonenmaske & )) true ist.

 

Die verbleibenden Schablonenrenderzustände gelten immer sowohl für Dreiecke im Uhrzeigersinn als auch gegen den Uhrzeigersinn.

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

Ein neues CapBit gibt an, ob das Gerät dieses Feature unterstützt. Von Treibern, die dieses Feature nicht unterstützen, wird erwartet, dass sie diese neuen Renderzustände ignorieren. Alle anderen Schablonenkappenbits gelten für beide Modi der Schablonenpufferung. Da Two_Sided_Stencil die Möglichkeit impliziert, mit D3DCULLMODE_NONE zu zeichnen, muss die entsprechende Obergrenze vom Treiber festgelegt werden, wenn er 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