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’ombre convertis par la géométrie d’occluding, en calculant les bords de silhouette et en les extrudant de la lumière en 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 vers l’avant et incrémente les valeurs de mémoire tampon de gabarit. Le deuxième rendu dessine les polygones de l’ombre du volume d’ombre et décrémente les valeurs de mémoire tampon de gabarit. Normalement, toutes les valeurs incrémentées et décrémentées s’annulent. Toutefois, la scène a déjà été rendue avec une géométrie normale, ce qui entraîne l’échec du test de mémoire tampon z lorsque le volume de l’ombre est affiché. Les valeurs laissées dans la mémoire tampon de gabarit correspondent aux pixels qui se trouvent dans l’ombre. Ces autres contenus de mémoire tampon de gabarit sont utilisés comme masque, pour fusionner un quad noir large et englobant dans la scène. Avec la mémoire tampon de gabarit agissant en tant que masque, le résultat consiste à assombrir les pixels qui se trouvent dans les ombres.

Cela signifie que la géométrie de l’ombre est dessinée deux fois par source de lumière, ce qui entraîne une pression sur le débit de vertex du GPU. La fonctionnalité de gabarit à deux côtés a été conçue pour atténuer cette situation. Dans cette approche, il existe deux ensembles d’états de gabarit (nommés ci-dessous), un ensemble pour les triangles frontaux et l’autre pour les triangles vers l’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 FAUX par défaut, ce qui signifie que le comportement actuel (DirectX 8). Lorsque cette valeur est définie sur TRUE (elle fonctionne uniquement si D3DSTENCILCAPS_TWOSIDED est définie), les états de rendu suivants s’appliquent uniquement aux triangles frontaux (dans le sens des aiguilles d’une montre).

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

 

Un nouvel ensemble d’états de rendu s’applique aux triangles back-facing (contrebloclockwise).

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

 

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

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

Un nouveau bit de limite 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 de gabarit. Étant donné que Two_Sided_Stencil implique la possibilité de dessiner avec D3DCULLMODE_NONE ensemble, 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 gabarit

D3DRENDERSTATETYPE