Partager via


gabarit Two-Sided (Direct3D 9)

Les volumes d’ombres sont utilisés pour dessiner des ombres avec la mémoire tampon de gabarit. L’application calcule les volumes d’ombres projetés en occludant la géométrie, en calculant les bords de silhouette et en les extrayant loin de la lumière dans un ensemble de volumes 3D. Ces volumes sont ensuite rendus deux fois dans la mémoire tampon de gabarit.

Le premier rendu dessine des polygones orientés vers l’avant et incrémente les valeurs de stencil-buffer. Le deuxième rendu dessine les polygones orientés vers l’arrière du volume d’ombre et décrémente les valeurs de mémoire tampon du gabarit. Normalement, toutes les valeurs incrémentées et décrémentées s’annulent mutuellement. Toutefois, la scène a déjà été rendue avec une géométrie normale, ce qui a entraîné l’échec du test de la mémoire tampon z à mesure que le volume d’ombre est restitué. Les valeurs laissées dans la mémoire tampon de gabarit correspondent aux pixels qui se trouvent dans l’ombre. Le contenu de la mémoire tampon de gabarit restant est utilisé comme masque pour mélanger un grand quad noir englobant dans la scène. Avec la mémoire tampon de gabarit agissant comme un masque, le résultat est d’assombrir les pixels qui se trouvent dans les ombres.

Cela signifie que la géométrie d’ombre est dessinée deux fois par source de lumière, ce qui exerce une pression sur le débit de vertex du GPU. La fonctionnalité de gabarit double face a été conçue pour atténuer cette situation. Dans cette approche, il existe deux ensembles d’état de gabarit (nommés ci-dessous), l’un défini chacun pour les triangles avant et l’autre pour les triangles arrière. De cette façon, une seule passe est dessinée par volume d’ombre, par lumière.

Les modifications d’API sont limitées à un nouvel ensemble d’états de rendu. Le nouvel état de rendu D3DRS_Two_Sided_StencilMODE peut être défini sur TRUE ou FALSE. Il est FALSE par défaut, ce qui signifie le comportement actuel (DirectX 8). Lorsque cette valeur est définie sur TRUE (elle ne fonctionne que si D3DSTENCILCAPS_TWOSIDED est définie), les états de rendu suivants s’appliquent uniquement aux triangles avant (dans le sens des aiguilles d’une montre).

État de rendu Description
D3DRS_STENCILFAIL D3DSTENCILOP à faire si le test de gabarit échoue.
D3DRS_STENCILZFAIL D3DSTENCILOP à faire si le test de gabarit réussit et que z-test échoue.
D3DRS_STENCILPASS D3DSTENCILOP à faire si les tests stencil et z réussissent.
D3DRS_STENCILFUNC D3DCMPFUNC fn. Stencil Test réussit si ((ref & mask) stencilfn (stencil & mask)) a la valeur true.

 

Un nouvel ensemble d’états de rendu s’applique aux triangles dos (dans le sens inverse des aiguilles d’une montre).

État de rendu Description
D3DRS_CCW_STENCILFAIL D3DSTENCILOP à faire si le test de gabarit échoue.
D3DRS_CCW_STENCILZFAIL D3DSTENCILOP à faire si le test de gabarit réussit et que z-test échoue.
D3DRS_CCW_STENCILPASS D3DSTENCILOP à faire si les tests stencil et z réussissent.
D3DRS_CCW_STENCILFUNC Fonction D3DCMPFUNC. Le test de gabarit réussit si ((ref & mask) stencilfn (stencil & mask)) a la valeur true.

 

Les états de rendu de gabarit restants s’appliquent toujours aux triangles dans le sens des aiguilles d’une montre et dans le sens inverse des aiguilles d’une montre.

D3DRS_Two_Sided_StencilMODE est ignoré pour les lignes et les sprites de point, ce qui signifie que le comportement est inchangé par rapport à DirectX 8. Les états de rendu D3DRS_CCW_STENCIL* sont ignorés.

Un nouveau bit majuscule indique si l’appareil prend en charge cette fonctionnalité. Les pilotes qui ne prennent pas en charge cette fonctionnalité sont censés ignorer ces nouveaux états de rendu. Tous les autres bits de limite de gabarit s’appliquent aux deux modes de mise en mémoire tampon du gabarit. Étant donné que Two_Sided_Stencil implique la possibilité de dessiner avec D3DCULLMODE_NONE défini, la limite correspondante doit être définie par le pilote s’il prend en charge ce nouveau mode de gabarit. Microsoft Windows Hardware Quality Labs (WHQL) doit l’appliquer.

Nouveaux états de rendu :

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

Nouvelle limite :

D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps

Techniques de mémoire tampon de gabarit

D3DRENDERSTATETYPE