Mémoires tampons de gabarits

Un tampon stencil buffer est utilisé pour masquer les pixels d’une image afin de produire des effets spéciaux. Le masque contrôle si le pixel est dessiné ou non. Ces effets spéciaux incluent la composition ; le transfert ; dissout, disparaît et balaye ; structures et silhouettes ; et gabarit à deux côtés. Certains des effets les plus courants sont présentés ci-dessous.

Le tampon stencil buffer active ou désactive le dessin sur l’aire cible de rendu sur une base de pixel par pixel. Au niveau le plus fondamental, il permet aux applications de masquer les sections de l’image rendue afin qu’elles ne soient pas affichées. Les applications utilisent souvent des tampons stencil buffer pour des effets spéciaux tels que les dissolutions, le transfert et la structure.

Les informations de tampon stencil buffer sont incorporées dans les données z-buffer.

Fonctionnement du tampon stencil buffer

Direct3D effectue un test sur le contenu du tampon stencil buffer sur une base de pixels par pixels. Pour chaque pixel de la surface cible, il effectue un test à l’aide de la valeur correspondante dans le tampon stencil buffer, d’une valeur de référence de gabarit et d’une valeur de masque de gabarit. Si le test réussit, Direct3D effectue une action. Le test est effectué à l’aide des étapes suivantes.

  1. Effectuez une opération AND au niveau du bit de la valeur de référence du gabarit avec le masque de gabarit.
  2. Effectuez une opération AND au niveau du bit de la valeur du tampon stencil buffer pour le pixel actuel avec le masque de gabarit.
  3. Comparez le résultat de l’étape 1 au résultat de l’étape 2, à l’aide de la fonction de comparaison.

Les étapes ci-dessus sont présentées dans la ligne de code suivante :

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
  • StencilRef représente la valeur de référence du gabarit.
  • StencilMask représente la valeur du masque de gabarit.
  • CompFunc est la fonction de comparaison.
  • StencilBufferValue est le contenu du tampon stencil buffer pour le pixel actuel.
  • Le symbole ampersand (&) représente l’opération AND au niveau du bit.

Le pixel actuel est écrit sur la surface cible si le test de gabarit réussit et est ignoré sinon. Le comportement de comparaison par défaut consiste à écrire le pixel, quelle que soit la façon dont chaque opération au niveau du bit s’avère. Vous pouvez modifier ce comportement en modifiant la valeur d’un type énuméré pour identifier la fonction de comparaison souhaitée.

Votre application peut personnaliser l’opération du tampon stencil buffer. Il peut définir la fonction de comparaison, le masque de gabarit et la valeur de référence du gabarit. Il peut également contrôler l’action effectuée par Direct3D lorsque le test de gabarit réussit ou échoue.

Compostage

Votre application peut utiliser le tampon stencil buffer pour composite des images 2D ou 3D sur une scène 3D. Un masque dans la mémoire tampon de gabarit est utilisé pour masquer une zone de la surface cible de rendu. Les informations 2D stockées, telles que du texte ou des bitmaps, peuvent ensuite être écrites dans la zone bloquée. Vous pouvez également afficher des primitives 3D supplémentaires dans la région masquée par gabarit de la surface cible de rendu. Elle peut même restituer une scène entière.

Les jeux composent souvent plusieurs scènes 3D ensemble. Par exemple, les jeux de conduite affichent généralement une vue arrière miroir. La miroir contient la vue de la scène 3D derrière le pilote. Il s’agit essentiellement d’une deuxième scène 3D composite avec la vue avant du pilote.

Mise à l’échelle

Les applications Direct3D utilisent la mise à l’échelle pour contrôler quels pixels d’une image primitive particulière sont dessinés vers l’aire cible de rendu. Les applications appliquent des décalcomanies aux images de primitives pour permettre aux polygones coplanaires de s’afficher correctement.

Par exemple, lors de l’application de marques de pneus et de lignes jaunes à une route, les marquages doivent apparaître directement au-dessus de la route. Toutefois, les valeurs z des marquages et de la route sont identiques. Par conséquent, la mémoire tampon de profondeur peut ne pas produire de séparation propre entre les deux. Certains pixels de la primitive arrière peuvent être rendus sur la primitive avant et vice versa. L’image résultante semble scintiller du cadre au cadre. Cet effet est appelé z-fighting ou scintillement.

Pour résoudre ce problème, utilisez un gabarit pour masquer la section de la primitive arrière où la décalcomanie s’affiche. Désactivez la mise en mémoire tampon z et affichez l’image de la primitive frontale dans la zone masquée de la surface cible de rendu.

Bien que plusieurs mélanges de textures puissent être utilisés pour résoudre ce problème, cela limite le nombre d’autres effets spéciaux que votre application peut produire. L’utilisation du tampon stencil buffer pour appliquer des décalcomanies libère les étapes de fusion de textures pour d’autres effets.

Dissout, disparaît et balaie

De plus en plus, les applications utilisent des effets spéciaux couramment utilisés dans les films et la vidéo, tels que les dissolutions, les balayages et les fondus.

Dans une dissolution, une image est progressivement remplacée par une autre dans une séquence lisse d’images. Bien que Direct3D fournit des méthodes d’utilisation de plusieurs fusions de textures pour obtenir le même effet, les applications qui utilisent le tampon stencil buffer pour les dissolutions peuvent utiliser des fonctionnalités de fusion de texture pour d’autres effets pendant qu’elles effectuent une dissolution.

Lorsque votre application effectue une dissolution, elle doit afficher deux images différentes. Elle utilise le tampon stencil buffer pour contrôler les pixels de chaque image dessinés vers l’aire cible de rendu. Vous pouvez définir une série de masques de gabarit et les copier dans le tampon stencil buffer sur des images successives. Vous pouvez également définir un masque de gabarit de base pour le premier cadre et le modifier de manière incrémentielle.

Au début de la dissolution, votre application définit la fonction de gabarit et le masque de gabarit afin que la plupart des pixels de l’image de départ réussissent le test de gabarit. La plupart des pixels de l’image de fin doivent échouer au test de gabarit. Sur les images successives, le masque de gabarit est mis à jour afin que de moins en moins de pixels dans l’image de départ réussissent le test. À mesure que les images progressent, de moins en moins de pixels dans l’image de fin échouent au test. De cette façon, votre application peut effectuer une dissolution à l’aide de n’importe quel modèle de dissolution arbitraire.

L’ouverture en fondu ou la fermeture en fondu est un cas particulier de dissolution. Lors de la décoloration, la mémoire tampon de gabarit est utilisée pour se disparaître d’une image noire ou blanche vers un rendu d’une scène 3D. La fermeture en fondu est l’inverse, votre application commence par un rendu d’une scène 3D et se dissout en noir ou blanc. Le fondu peut être effectué à l’aide de n’importe quel modèle arbitraire que vous souhaitez utiliser.

Les applications Direct3D utilisent une technique similaire pour les balayages. Par exemple, lorsqu’une application effectue un mouvement de balayage de gauche à droite, l’image de fin apparaît progressivement en haut de l’image de départ de gauche à droite. Comme dans une dissolution, vous devez définir une série de masques de gabarit chargés dans le tampon stencil buffer sur des images successives, ou modifier successivement le masque de gabarit de départ. Les masques de gabarit sont utilisés pour désactiver l’écriture de pixels à partir de l’image de départ et pour permettre l’écriture de pixels à partir de l’image de fin.

Un balayage est un peu plus complexe qu’une dissolution dans laquelle votre application doit lire les pixels de l’image de fin dans l’ordre inverse du balayage. Autrement dit, si le balayage passe de gauche à droite, votre application doit lire les pixels de l’image de fin de droite à gauche.

Structures et silhouettes

Vous pouvez utiliser le tampon stencil buffer pour des effets plus abstraits, tels que la structure et la définition de la silhouette.

Si votre application applique un masque de gabarit à l’image d’une primitive qui est la même forme, mais légèrement plus petite, l’image résultante contient uniquement la structure de la primitive. L’application peut ensuite remplir la zone masquée par gabarit de l’image avec une couleur unie, ce qui donne à la primitive une apparence en relief.

Si le masque de gabarit est de la même taille et de la même forme que la primitive que vous affichez, l’image résultante contient un trou où la primitive doit être. Votre application peut ensuite remplir l’espace avec du noir pour produire une silhouette de la primitive.

Gabarit à deux côtés

Les volumes d’ombres sont utilisés pour dessiner des ombres avec le tampon stencil buffer. L’application calcule les volumes d’ombre projetés par la géométrie d’obturation, 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 le tampon stencil buffer.

Le premier rendu dessine des polygones vers l’avant et incrémente les valeurs de tampon stencil buffer. Le deuxième rendu dessine les polygones arrière du volume d’ombre et décrémente les valeurs du tampon stencil buffer. 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 le tampon stencil buffer correspondent aux pixels qui se trouvent dans l’ombre. Ces autres contenus de tampon stencil buffer sont utilisés comme masque, pour fusionner un quad noir large et englobant dans la scène. Avec le tampon stencil buffer 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 prévenir 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 arrières. De cette façon, une seule passe est dessinée par volume d’ombre, par lumière.

Mémoires tampons de profondeurs et de gabarits