Règles de rastérisation

Les règles de rastérisation définissent la façon dont les données vectorielles sont mappées aux données raster. Les données raster sont alignées sur des emplacements entiers qui sont ensuite abattus et coupés (pour dessiner le nombre minimal de pixels), et les attributs par pixel sont interpolés (à partir d’attributs par vertex) avant d’être passés à un nuanceur de pixels.

Il existe plusieurs types de règles, qui dépendent du type de primitive en cours de mappage, ainsi que de la question de savoir si les données utilisent ou non le multi-échantillonnage pour réduire l’aliasing. Les illustrations suivantes montrent comment les cas d’angle sont gérés.

Règles de rastérisation triangle (sans multi-échantillonnage)

Tout centre de pixels qui se trouve à l’intérieur d’un triangle est dessiné ; un pixel est supposé être à l’intérieur s’il réussit la règle en haut à gauche. La règle en haut à gauche est qu’un centre de pixels est défini pour se trouver à l’intérieur d’un triangle s’il se trouve sur le bord supérieur ou le bord gauche d’un triangle.

Où :

  • Un bord supérieur est un bord qui est exactement horizontal et est au-dessus des autres bords.
  • Un bord gauche est un bord qui n’est pas exactement horizontal et se trouve sur le côté gauche du triangle. Un triangle peut avoir un ou deux bords gauches.

La règle en haut à gauche garantit que les triangles adjacents sont dessinés une fois.

Cette illustration montre des exemples de pixels qui sont dessinés parce qu’ils se trouvent à l’intérieur d’un triangle ou suivent la règle en haut à gauche.

illustration d’exemples de rastérisation du triangle supérieur gauche

La couverture gris clair et foncé des pixels les montre sous forme de groupes de pixels pour indiquer le triangle qu’ils se trouvent à l’intérieur.

Règles de rastérisation de ligne (avec alias, sans multi-échantillonnage)

Les règles de rastérisation de ligne utilisent une zone de test diamant pour déterminer si une ligne couvre un pixel. Pour les lignes x-majors (lignes avec -1 <= pente <= +1), la zone d’essai du diamant comprend (montrée solide) le bord inférieur gauche, le bord inférieur droit et le coin inférieur ; le diamant exclut (indiqué en pointillés) le bord supérieur gauche, le bord supérieur droit, le cordon supérieur, le coin gauche et le coin droit. Une ligne Y-major est toute ligne qui n’est pas une ligne x-major; la zone de diamant d’essai est la même que celle décrite pour la ligne x-major, sauf que le coin droit est également inclus.

Compte tenu de la zone de diamant, une ligne couvre un pixel si la ligne quitte la zone de test du diamant du pixel lors du déplacement le long de la ligne du début vers la fin. Une bande de trait se comporte de la même façon, car elle est dessinée comme une séquence de lignes.

L’illustration suivante montre quelques exemples.

illustration d’exemples de rastérisation de ligne avec alias

Règles de rastérisation de ligne (antialiased, sans multi-échantillonnage)

Une ligne antialiased est rastérisée comme s’il s’agissait d’un rectangle (avec largeur = 1). Le rectangle croise une cible de rendu produisant des valeurs de couverture par pixel, qui sont multipliées en composants alpha de sortie du nuanceur de pixels. Il n’y a pas de préformation d’anticrénelage lors du dessin de lignes sur une cible de rendu multiéchantillonnée.

Il est considéré qu’il n’existe pas de « meilleure » façon d’effectuer un rendu de traits anti-ataliased. Direct3D 10 adopte comme ligne directrice la méthode illustrée dans l’illustration suivante. Cette méthode a été dérivée empiriquement, présentant un certain nombre de propriétés visuelles jugées souhaitables. Le matériel n’a pas besoin de correspondre exactement à cet algorithme ; les tests par rapport à cette référence doivent avoir des tolérances « raisonnables », guidées par certains des principes énumérés ci-dessous, ce qui permet diverses implémentations matérielles et de filtrer les tailles de noyau. Toutefois, aucune de cette flexibilité autorisée dans l’implémentation matérielle ne peut être communiquée via Direct3D 10 aux applications, au-delà du simple dessin de lignes et de l’observation/mesure de leur apparence.

illustration d’exemples de rastérisation de ligne anti-ataliased

Cet algorithme génère des lignes relativement lisses, avec une intensité uniforme, avec des bords déchiquetés ou des tresses minimes. Le modèle Moire pour les lignes proches est réduit. Il existe une bonne couverture pour les jonctions entre les segments de ligne placés de bout en bout. Le noyau de filtre est un compromis raisonnable entre la quantité de flou des bords et les changements d’intensité causés par les corrections gamma. La valeur de couverture est multipliée en nuanceur de pixels o0.a (srcAlpha) selon la formule suivante par l’étape de fusion de sortie : srcColor * srcAlpha + destColor * (1-srcAlpha).

Règles de rastérisation de points (sans multi-échantillonnage)

Un point est interprété comme s’il était composé de deux triangles dans un modèle Z, qui utilisent des règles de rastérisation de triangle. La coordonnée identifie le centre d’un carré d’un pixel de large. Il n’y a pas d’élimination pour les points.

L’illustration suivante montre quelques exemples.

illustration d’exemples de rastérisation de points

Règles de rastérisation anti-alias multi-échantillonnage

L’anti-ataliasing multi-échantillon (MSAA) réduit l’aliasing géométrique à l’aide de tests de couverture de pixels et de gabarit de profondeur à plusieurs emplacements de sous-échantillons. Pour améliorer les performances, les calculs par pixel sont effectués une fois pour chaque pixel couvert, en partageant les sorties du nuanceur sur les sous-pixels couverts. L’anti-attirail multiéchantillon ne réduit pas l’aliasing de surface. Les exemples d’emplacements et de fonctions de reconstruction dépendent de l’implémentation matérielle.

L’illustration suivante montre quelques exemples.

illustration d’exemples de rastérisation antialias multi-échantillon

Le nombre d’exemples d’emplacements dépend du mode multiéchantillon. Les attributs de vertex sont interpolés au centre des pixels, car c’est là que le nuanceur de pixels est appelé (cela devient une extrapolation si le centre n’est pas couvert). Les attributs peuvent être marqués dans le nuanceur de pixels à échantillonner au centroïde, ce qui entraîne l’interpolation de l’attribut par les pixels non couverts à l’intersection de la zone du pixel et de la primitive. Un nuanceur de pixels s’exécute pour chaque zone de 2x2 pixels pour prendre en charge les calculs dérivés (qui utilisent des deltas x et y). Cela signifie que les appels de nuanceur se produisent plus que ce qui est indiqué pour remplir les 2x2 quanta minimum (qui est indépendant du multi-échantillonnage). Le résultat du nuanceur est écrit pour chaque échantillon couvert qui réussit le test de gabarit de profondeur par échantillon.

Les règles de rastérisation pour les primitives sont, en général, inchangées par l’anticrénelage multi-échantillon, sauf :

  • Pour un triangle, un test de couverture est effectué pour chaque exemple d’emplacement (pas pour un centre de pixels). Si plusieurs exemples d’emplacement sont couverts, un nuanceur de pixels s’exécute une fois avec des attributs interpolés au centre des pixels. Le résultat est stocké (répliqué) pour chaque emplacement d’exemple couvert dans le pixel qui réussit le test de profondeur/gabarit.

    Une ligne est traitée comme un rectangle composé de deux triangles, avec une largeur de ligne de 1,4.

  • Pour un point, un test de couverture est effectué pour chaque exemple d’emplacement (pas pour un centre de pixels).

De nombreux formats prennent en charge le multi-échantillonnage (voir Prise en charge matérielle des formats Direct3D 10), certains formats peuvent être résolus (ResolveSubresource; qui sous-échantillonne un format multi-échantillonné à un exemple de taille 1). Les formats multi-échantillonnage peuvent être utilisés dans des cibles de rendu qui peuvent être lues dans les nuanceurs à l’aide de la charge, car aucune résolution n’est requise pour les exemples individuels auxquels le nuanceur accède. Les formats de profondeur ne sont pas pris en charge pour les ressources multiéchantillons. Par conséquent, les formats de profondeur sont limités au rendu des cibles uniquement.

Les formats sans type (R8G8B8A8_TYPELESS pour instance) prennent en charge le multi-échantillonnage pour permettre à une vue de ressources d’interpréter les données de différentes manières. Par instance, vous pouvez créer une ressource multiéchantillon à l’aide de R8G8B8A8_TYPELESS, l’afficher à l’aide d’une ressource render-target-view au format R8G8B8A8_UINT, puis résoudre le contenu en une autre ressource avec un format de données R8G8B8A8_UNORM.

Prise en charge matérielle

L’API signale la prise en charge matérielle du multi-échantillonnage par le nombre de niveaux de qualité. Par exemple, un niveau de qualité 0 signifie que le matériel ne prend pas en charge le multi-échantillonnage (à un format et un niveau de qualité particuliers). La valeur 3 pour les niveaux de qualité signifie que le matériel prend en charge trois exemples de disposition différents et/ou des algorithmes de résolution. Vous pouvez également supposer ce qui suit :

  • Tout format prenant en charge le multi-échantillonnage prend en charge le même nombre de niveaux de qualité pour chaque format de cette famille.
  • Chaque format prenant en charge le multi-échantillonnage et ayant les formats _UNORM, _SRGB, _SNORM ou _FLOAT, prend également en charge la résolution.

Échantillonnage centroïde d’attributs lors de l’anti-ataliasing multi-échantillon

Par défaut, les attributs de vertex sont interpolés vers un centre de pixels lors de l’anticrénelage multi-échantillon ; si le centre de pixels n’est pas couvert, les attributs sont extrapolé à un centre de pixels. Si une entrée de nuanceur de pixels qui contient la sémantique centroïde (en supposant que le pixel n’est pas entièrement couvert) est échantillonné quelque part dans la zone couverte du pixel, éventuellement à l’un des emplacements d’exemples couverts. Un exemple de masque (spécifié par l’état de rastériseur) est appliqué avant le calcul centroïde. Par conséquent, un exemple masqué ne sera pas utilisé comme emplacement centroïde.

Le rastériseur de référence choisit un exemple d’emplacement pour l’échantillonnage centroïde semblable à ce qui suit :

  • L’exemple de masque autorise tous les exemples. Utilisez un centre de pixels si le pixel est couvert ou si aucun des exemples n’est couvert. Sinon, le premier exemple couvert est choisi, en commençant par le centre des pixels et en se déplaçant vers l’extérieur.
  • L’exemple de masque désactive tous les exemples sauf un (scénario courant). Une application peut implémenter le suréchantillonnage multipass en effectuant un cycle dans des valeurs d’exemple-masque mono bits et en revoyant la scène pour chaque exemple à l’aide de l’échantillonnage centroïde. Pour cela, une application doit ajuster les dérivés pour sélectionner de manière appropriée des mips de texture plus détaillées pour la densité d’échantillonnage de texture plus élevée.

Calculs dérivés en cas de multi-échantillonnage

Les nuanceurs de pixels s’exécutent toujours à l’aide d’une zone minimale de 2x2 pixels pour prendre en charge les calculs dérivés, qui sont calculés en prenant des deltas entre les données des pixels adjacents (en supposant que les données de chaque pixel ont été échantillonnées avec un espacement unitaire horizontalement ou verticalement). Cela n’est pas affecté par le multi-échantillonnage.

Si des dérivés sont demandés sur un attribut qui a été échantillonné au centroïde, le calcul matériel n’est pas ajusté, ce qui peut entraîner des dérivés inexacts. Un nuanceur s’attend à un vecteur unitaire dans l’espace cible de rendu, mais peut obtenir un vecteur non unitaire par rapport à un autre espace vectoriel. Par conséquent, il est de la responsabilité d’une application de faire preuve de prudence lors de la demande de dérivés d’attributs qui sont échantillonnées centroïdes. En fait, il est recommandé de ne pas combiner les dérivés et l’échantillonnage centroïde. L’échantillonnage centroïde peut être utile dans les situations où il est essentiel que les attributs interpolés d’une primitive ne soient pas extrapolés, mais cela s’accompagne de compromis tels que des attributs qui semblent sauter lorsqu’un bord primitif traverse un pixel (plutôt que de changer continuellement) ou des dérivés qui ne peuvent pas être utilisés par les opérations d’échantillonnage de texture qui dérivent LOD.

Étape du rastériseur