Delen via


Two-Sided stencil (Direct3D 9)

Schaduwvolumes worden gebruikt voor het tekenen van schaduwen met de stencilbuffer. De toepassing berekent de schaduwvolumes die door ocdinggeometrie worden gegoten, door de silhouetranden te berekenen en ze uit de buurt van het licht in een set 3D-volumes te extruseren. Deze volumes worden vervolgens twee keer weergegeven in de stencilbuffer.

Met de eerste render worden naar voren gerichte veelhoeken opgehaald en worden de waarden voor de stencilbuffer verhoogd. Met de tweede weergave worden de achtergerichte veelhoeken van het schaduwvolume opgehaald en worden de bufferwaarden voor het stencil afgezet. Normaal gesproken annuleren alle incrementele en aflopende waarden elkaar. De scène is echter al weergegeven met normale geometrie, waardoor sommige pixels de z-buffertest mislukken omdat het schaduwvolume wordt weergegeven. Waarden links in de stencilbuffer komen overeen met pixels die zich in de schaduw bevinden. Deze resterende inhoud van een stencilbuffer wordt gebruikt als masker om een grote, allesomvattende zwarte quad in de scène te combineren. Met de stencilbuffer die als masker fungeert, is het resultaat om pixels die zich in de schaduwen bevinden, donkerder te maken.

Dit betekent dat de schaduwgeometrie twee keer per lichtbron wordt getekend, waardoor de druk op de hoekpuntdoorvoer van de GPU wordt gelegd. De tweezijdige stencilfunctie is ontworpen om deze situatie te verhelpen. Bij deze benadering zijn er twee sets stencilstatus (hieronder genoemd), één set voor de voorzijde driehoeken en de andere voor de back-facing driehoeken. Op deze manier wordt per schaduwvolume slechts één pas getekend, per licht.

De API-wijzigingen zijn beperkt tot een nieuwe set renderstatussen. De nieuwe renderstatus D3DRS_Two_Sided_StencilMODE kan worden ingesteld op TRUE of FALSE. Het is FALSE- standaard, wat betekent huidig gedrag (DirectX 8). Wanneer dit is ingesteld op TRUE (dit werkt alleen als D3DSTENCILCAPS_TWOSIDED is ingesteld), zijn de volgende renderstatussen alleen van toepassing op de driehoeken aan de voorzijde (rechtsom).

Status weergeven Beschrijving
D3DRS_STENCILFAIL D3DSTENCILOP om te doen als de stenciltest mislukt.
D3DRS_STENCILZFAIL D3DSTENCILOP om te doen als het stencil wordt getest en z-test mislukt.
D3DRS_STENCILPASS D3DSTENCILOP om te doen als zowel het stencil als de z-tests slagen.
D3DRS_STENCILFUNC D3DCMPFUNC fn. Stenciltest passeert of (verw & masker) stencilfn (stencil & masker)) waar is.

 

Een nieuwe set renderstatussen is van toepassing op de driehoeken aan de achterzijde (linksom).

Status weergeven Beschrijving
D3DRS_CCW_STENCILFAIL D3DSTENCILOP om te doen als de stenciltest mislukt.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP om te doen als het stencil wordt getest en z-test mislukt.
D3DRS_CCW_STENCILPASS D3DSTENCILOP om te doen als zowel het stencil als de z-tests slagen.
D3DRS_CCW_STENCILFUNC D3DCMPFUNC functie. Stenciltest slaagt als ((ref & masker) stencilfn (stencil & masker)) waar is.

 

De resterende stencilweergavestatussen zijn altijd van toepassing op zowel linksom als rechtsom driehoeken.

D3DRS_Two_Sided_StencilMODE wordt genegeerd voor lijnen en puntspites, wat betekent dat het gedrag ongewijzigd is van DirectX 8. De D3DRS_CCW_STENCIL* weergavestatussen worden genegeerd.

Een nieuwe cap-bit geeft aan of het apparaat deze functie ondersteunt. Stuurprogramma's die deze functie niet ondersteunen, worden verwacht deze nieuwe renderstatussen te negeren. Alle andere stencillimieten zijn van toepassing op beide modi van stencilbuffering. Omdat Two_Sided_Stencil de mogelijkheid impliceert om te tekenen met D3DCULLMODE_NONE set, moet de bijbehorende limiet worden ingesteld door het stuurprogramma als deze nieuwe stencilmodus wordt ondersteund. Microsoft Windows Hardware Quality Labs (WHQL) moet dit afdwingen.

Nieuwe renderstatussen:

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

Nieuwe limiet:

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

Stencilbuffertechnieken

D3DRENDERSTATETYPE