Règles de rastérisation
Les règles de rastérisation définissent la façon dont les données vectorielles sont mappées en données raster. Les données raster sont alignées sur des emplacements entiers qui sont ensuite supprimés et clippé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 mappé, ainsi que si les données utilisent ou non l’échantillonnage multiple pour réduire l’alias. Les illustrations suivantes montrent comment les cas d’angle sont gérés.
Règles de rastérisation de triangle (sans multisampling)
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 passe la règle en haut à gauche. La règle supérieure 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 se trouve au-dessus des autres bords.
- Un bord gauche est un bord qui n’est pas exactement horizontal et qui se trouve à gauche du triangle A 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 dessinés, car ils se trouvent à l’intérieur d’un triangle ou suivent la règle en haut à gauche.
Le couvert clair et gris foncé des pixels les montre sous forme de groupes de pixels pour indiquer le triangle qu’ils sont à l’intérieur.
Règles de rastérisation de ligne (alias, sans multisampling)
Les règles de rastérisation de trait utilisent une zone de test de diamant pour déterminer si une ligne couvre un pixel. Pour les lignes principales x (lignes avec -1 <= pente <= +1), la zone de test de diamant comprend (illustré solide) le bord inférieur gauche, le bord inférieur droit et le coin inférieur ; le diamant exclut (pointillé) le bord supérieur gauche, le bord supérieur droit, le cordon supérieur droit, le coin gauche et le coin droit. Une ligne y-major est n’importe quelle 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.
Étant donné la zone de diamant, une ligne couvre un pixel si la ligne quitte la zone de test de diamant du pixel lors du déplacement le long de la ligne du début vers la fin. Une bande de traits 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.
Règles de rastérisation de ligne (antialiased, sans multisampling)
Une ligne antialiased est ratérisée comme s’il s’agissait d’un rectangle (avec largeur = 1). Le rectangle se croise avec une cible de rendu produisant des valeurs de couverture par pixel, multipliées en composants alpha de sortie de nuanceur de pixels. Il n’y a pas d’anticrénelage préformé lors du dessin de lignes sur une cible de rendu multisamplée.
Il est considéré qu’il n’existe aucun moyen unique de « meilleur » pour effectuer un rendu de ligne antialiased. Direct3D adopte comme guide la méthode indiqué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 exactement de correspondre à cet algorithme ; les tests contre cette référence doivent avoir des tolérances « raisonnables », guidées par certains des principes répertoriés ci-dessous, permettant diverses implémentations matérielles et tailles de noyau de filtre. Aucune de cette flexibilité n’est permise dans l’implémentation matérielle, cependant, peut être communiquée via Direct3D aux applications, au-delà du simple dessin des lignes et de l’observation/mesure de leur apparence.
Cet algorithme génère des lignes relativement lisses, avec une intensité uniforme, avec des bords ou des bradages minimal. Le modèle Moire pour les lignes fermées 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 de bord 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) par la formule suivante par l’étape de fusion de sortie (OM) :
srcColor * srcAlpha + destColor * (1-srcAlpha)
Règles de rastérisation de point (sans échantillonnage multiple)
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é large d’un pixel. Il n’y a pas de culage pour les points.
L’illustration suivante montre quelques exemples.
Règles de rastérisation d’anticrénelage multisample
L’antialiasing multisample (MSAA) réduit l’alias géométrique à l’aide de tests de couverture de pixels et de gabarit de profondeur à plusieurs emplacements de sous-échantillon. 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’anticrénelage multisample ne réduit pas l’alias 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.
Le nombre d’exemples d’emplacements dépend du mode multisample. Les attributs de vertex sont interpolés au niveau des centres de 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 pour être échantillonné au centroïde, ce qui entraîne l’interpolation des 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 2 x 2 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 le quanta minimum 2x2 (qui est indépendant de l’échantillonnage multisampling). Le résultat du nuanceur est écrit pour chaque échantillon couvert qui réussit le test de profondeur par échantillon de profondeur.
Les règles de rastérisation pour les primitives sont, en général, inchangées par l’anticrénelage multisample, à l’exception de :
Pour un triangle, un test de couverture est effectué pour chaque exemple d’emplacement (et non 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’échantillon 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 (et non pour un centre de pixels).
Les formats multi-échantillonnage peuvent être utilisés dans les cibles de rendu qui peuvent être lues dans des nuanceurs à l’aide de la charge, car aucune résolution n’est requise pour les échantillons individuels accessibles par le nuanceur. Les formats de profondeur ne sont pas pris en charge pour la ressource multisample. Par conséquent, les formats de profondeur sont limités aux cibles de rendu uniquement.
Les formats sans type prennent en charge l’échantillonnage multiple pour permettre à une vue de ressource d’interpréter les données de différentes façons. Par exemple, vous pouvez créer une ressource multisample à l’aide de R8G8B8A8_TYPELESS, la rendre à l’aide d’une ressource de vue cible de rendu avec un 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 de l’échantillonnage multiple via le nombre de niveaux de qualité. Par exemple, un niveau de qualité 0 signifie que le matériel ne prend pas en charge l’échantillonnage multiple (au niveau de la qualité et du format particulier). Un 3 pour les niveaux de qualité signifie que le matériel prend en charge trois exemples de dispositions et/ou algorithmes de résolution différents. Vous pouvez également supposer les éléments suivants :
- Tout format prenant en charge l’échantillonnage multiple prend en charge le même nombre de niveaux de qualité pour chaque format de cette famille.
- Chaque format qui prend en charge l’échantillonnage multiple et possède les formats _UNORM, _SRGB, _SNORM ou _FLOAT, prend également en charge la résolution.
Échantillonnage centroïde des attributs lorsque l’anticrénelage multisample
Par défaut, les attributs de vertex sont interpolés vers un centre de pixels pendant l’anticrénelage multisample ; si le centre de pixels n’est pas couvert, les attributs sont extrapables vers 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’exemple couverts. Un exemple de masque (spécifié par l’état de rastériseur) est appliqué avant le calcul centroïde. Par conséquent, un échantillon 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 similaire à ceci :
- L’exemple de masque autorise tous les exemples. Utilisez un centre de pixels si le pixel est couvert ou si aucun des échantillons n’est couvert. Sinon, le premier échantillon couvert est choisi, en commençant par le centre de pixels et en se déplaçant vers l’extérieur.
- L’exemple de masque désactive tous les exemples, mais un (scénario courant). Une application peut implémenter un supersampling multipass en effectuant un cycle à vélo via des valeurs de masque d’échantillon à bits unique et en recréant la scène pour chaque échantillon à l’aide de l’échantillonnage centroïde. Cela exigerait qu’une application ajuste 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 lors de l’échantillonnage multiple
Les nuanceurs de pixels s’exécutent toujours à l’aide d’une zone de pixels minimale de 2x2 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é échantillonées avec un espacement unitaire horizontalement ou verticalement). Cela n’est pas affecté par l’échantillonnage multiple.
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 incorrects. Un nuanceur s’attend à un vecteur d’unité dans l’espace cible de rendu, mais peut obtenir un vecteur non unitaire par rapport à un autre espace vectoriel. Par conséquent, il incombe à une application de faire preuve de prudence lors de la demande de dérivés d’attributs échantillonné au centroïde.
En fait, il est recommandé de ne pas combiner de dérivés et d’é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 extradés, mais cela est fourni avec des compromis tels que des attributs qui semblent sauter où un bord primitif croise un pixel (au lieu de changer en continu) ou des dérivés qui ne peuvent pas être utilisés par les opérations d’échantillonnage de texture qui dérivent LOD.
Rubriques connexes