Partager via


Tampons de pochoir

Un tampon de stencil est utilisé pour masquer les pixels dans une image, afin de créer des effets spéciaux. Le masque contrôle si le pixel est dessiné ou non. Ces effets spéciaux incluent l'intégration ; la décalcomanie ; les dissolutions, fondus et balayages ; les tracés et silhouettes ; et le pochoir à deux faces. Certains des effets les plus courants sont présentés ci-dessous.

Le tampon de stencil active ou désactive le dessin sur la surface cible de rendu à 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 de stencil pour des effets spéciaux tels que les dissolutions, la décalcomanie et le contourage.

Les informations du tampon de stencils sont intégrées dans les données du z-buffer.

Le fonctionnement du tampon de gabarit

Direct3D effectue un test sur le contenu du tampon de stencil au niveau de chaque pixel. Pour chaque pixel de la surface cible, il effectue un test à l’aide de la valeur correspondante dans la mémoire tampon de gabarit, 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 ET binaire 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 de la mémoire tampon de gabarit 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 pochoir.
  • StencilMask représente la valeur du masque de sténopé.
  • CompFunc est la fonction de comparaison.
  • StencilBufferValue est le contenu de la mémoire tampon de gabarit 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 pochoir 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 le fonctionnement du tampon de pochoir. 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 pochoir réussit ou échoue.

composition

Votre application peut utiliser le tampon de pochoir pour composer 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 obstruée. Votre application peut également rendre des primitives 3D supplémentaires dans la région masquée par le stencil de la surface cible de rendu. Il peut même restituer une scène entière.

Les jeux compositent souvent plusieurs scènes 3D ensemble. Par exemple, les jeux de conduite affichent généralement un miroir arrière. Le 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écalques 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é combat Z ou scintillement.

Pour résoudre ce problème, utilisez un gabarit pour masquer la section de l'objet de fond où le décalque apparaîtra. Désactivez le z-buffering et affichez l'image de la primitive avant dans la zone masquée de la surface de rendu cible.

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 de la mémoire tampon de gabarit pour appliquer des décalques libère les étapes de fusion de textures pour d’autres effets.

Dissous, fond et balaye

De plus en plus, les applications utilisent des effets spéciaux couramment utilisés dans les films et les vidéos, 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 la mémoire tampon de gabarit 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. Il utilise le tampon de gabarit pour contrôler les pixels de chaque image dessinés vers la surface cible de rendu. Vous pouvez définir une série de masques de gabarit et les copier dans le tampon de gabarit sur des trames 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 l'effacement, votre application définit la fonction de pochoir et le masque de pochoir afin que la plupart des pixels de l’image de départ réussissent le test de pochoir. La plupart des pixels de l'image finale doivent échouer au test de pochoir. Sur les images successives, le masque de gabarit est mis à jour pour qu'un nombre de plus en plus réduit de pixels de l’image de départ passe le test. À mesure que les images progressent, 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.

La décoloration ou la décoloration est un cas particulier de dissolvation. Lors de la décoloration, la mémoire tampon de gabarit est utilisée pour se dissoluer d’une image noire ou blanche vers un rendu d’une scène 3D. La décoloration 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 la mémoire tampon de gabarit 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.

Contours et silhouettes

Vous pouvez utiliser le tampon de pochoir pour des effets abstraits supplémentaires, tels que le contour et la mise en 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 le contour de la primitive. L’application peut ensuite remplir la zone masquée par gabarit de l’image avec une couleur unie, donnant à la primitive une apparence embossée.

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 là où la primitive devrait se trouver. Votre application peut ensuite remplir la cavité avec du noir pour produire une silhouette du modèle primitif.

gabarit à deux côtés

Les volumes d'ombre sont utilisés pour dessiner des ombres avec le tampon de stencil. L'application calcule les volumes d'ombre produits par la géométrie occultante, en calculant les bords de silhouette et en les extrudant à partir de la source de lumière pour former un ensemble de volumes 3D. Ces volumes sont ensuite rendus à deux reprises dans la mémoire tampon de gabarit.

Le premier rendu dessine des polygones orientés vers l'avant et incrémente les valeurs du tampon de stencil. Le deuxième rendu dessine les polygones arrière du volume d’ombre et décrémente les valeurs du tampon de masquage. 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 standard, provoquant l’échec du test du tampon Z pour certains pixels lorsque le volume d'ombre est rendu. Les valeurs laissées dans la mémoire tampon de stencil correspondent aux pixels qui se trouvent dans l’ombre. Ces contenus restants de mémoire tampon de gabarit sont utilisés comme masque, pour réaliser une combinaison alpha d'un quad noir de grande taille couvrant l'ensemble de la scène. Avec le tampon de stencil agissant comme masque, le résultat est d'assombrir les pixels qui se trouvent dans la zone d'ombre.

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 orientés vers l'avant et l’autre pour les triangles orientés vers l'arrière. De cette façon, une seule passe est dessinée par volume d’ombre, pour chaque source lumineuse.

Tampons de profondeur et de stencil