Partager via


Échantillonnage de point le plus proche

Les applications ne sont pas requises pour utiliser le filtrage de texture. Direct3D peut être défini afin qu’il calcule l’adresse texel, qui ne prend souvent pas en compte les entiers et copie la couleur du texel avec l’adresse entière la plus proche. Ce processus est appelé échantillonnage de point le plus proche. L’échantillonnage le plus proche peut être comme si la taille de la texture est similaire à la taille de l’image de la primitive sur l’écran. Si ce n’est pas le cas, la texture doit être agrandie ou minifiée. Le résultat de l’incompatibilité des tailles de texture à la taille d’image primitive peut être une image fragmentée, alias ou floue.

Utilisez soigneusement l’échantillonnage de point le plus proche, car il peut parfois provoquer des artefacts graphiques lorsque la texture est échantillonnée à la limite entre deux texels. Cette limite est la position le long de la texture (u ou v) à laquelle le texel échantillonné passe d’un texel à l’autre. Lorsque l’échantillonnage de points est utilisé, le système choisit un échantillon de texel ou l’autre, et le résultat peut passer brusquement d’un texel au texel suivant, car la limite est franchie. Cet effet peut apparaître sous forme d’artefacts graphiques non souhaités dans la texture affichée. Lorsque le filtrage linéaire est utilisé, le texel résultant est calculé à partir des texels adjacents et se mélange en douceur entre eux à mesure que l’index de texture se déplace dans la limite.

Cet effet peut être vu lors du mappage d’une très petite texture sur un très grand polygone : une opération souvent appelée agrandissement. Par exemple, lors de l’utilisation d’une texture qui ressemble à un checkerboard, l’échantillonnage de point le plus proche entraîne un plus grand checkerboard qui affiche des bords distincts. En revanche, le filtrage de texture linéaire entraîne une image où les couleurs du checkerboard varient en douceur sur le polygone.

Dans la plupart des cas, les applications reçoivent les meilleurs résultats en évitant l’exemple le plus proche possible. La majorité du matériel aujourd’hui est optimisée pour le filtrage linéaire, de sorte que votre application ne doit pas subir de dégradation des performances. Si l’effet souhaité nécessite absolument l’utilisation de l’échantillonnage le plus proche , par exemple lorsque vous utilisez des textures pour afficher des caractères de texte lisibles, votre application doit être extrêmement prudent pour éviter l’échantillonnage aux limites du texel, ce qui peut entraîner des effets indésirables. L’illustration suivante montre ce que ces artefacts peuvent ressembler.

illustration d’une boîte à six sections avec des lignes horizontales non continues dans les deux carrés supérieur droit

Les deux carrés en haut à droite du groupe apparaissent différents de leurs voisins, avec des décalages diagonales qui les parcourent. Pour éviter les artefacts graphiques comme ceux-ci, vous devez être familiarisé avec les règles d’échantillonnage de texture Direct3D pour le filtrage de point le plus proche. Direct3D mappe une coordonnée de texture à virgule flottante allant de [0,0, 1,0] (0,0 à 1,0, inclusive) à une valeur entière d’espace texel comprise entre [ - 0,5, n - 0,5], où n est le nombre de texels dans une dimension donnée sur la texture. L’index de texture résultant est arrondi à l’entier le plus proche. Ce mappage peut introduire des inexactitudes d’échantillonnage aux limites du texel.

Pour obtenir un exemple simple, imaginez une application qui restitue des polygones avec le mode d’adressage de texture Wrap. À l’aide du mappage utilisé par Direct3D, l’index de texture u est mappé comme indiqué dans le diagramme suivant pour une texture avec une largeur de 4 texels.

diagramme des coordonnées de texture 0.0 et 1.0 à la limite entre les texels

Les coordonnées de texture, 0,0 et 1,0 pour cette illustration, sont exactement à la limite entre les texels. À l’aide de la méthode par laquelle Direct3D mappe les valeurs, les coordonnées de texture sont comprises entre [ - 0,5, 4 - 0,5], où 4 est la largeur de la texture. Dans ce cas, le texel échantillonné est le 0 texel pour un index de texture de 1,0. Toutefois, si la coordonnée de texture n’était que légèrement inférieure à 1,0, le texel échantillonné serait le n texel au lieu de 0 texel.

L’implication de ceci est que l’agrandissement d’une petite texture à l’aide des coordonnées de texture exactement 0,0 et 1,0 avec filtrage de point le plus proche sur un triangle aligné à l’écran entraîne des pixels pour lesquels la carte de texture est échantillonnée à la limite entre les texels. Toute inexactitude dans le calcul des coordonnées de texture, toutefois petites, entraîne des artefacts le long des zones de l’image rendue qui correspondent aux bords texels de la carte de texture.

L’exécution de ce mappage de coordonnées de texture à virgule flottante en texels entiers avec une précision parfaite est difficile, le temps de calcul et généralement pas nécessaire. La plupart des implémentations matérielles utilisent une approche itérative pour calculer les coordonnées de texture à chaque emplacement de pixel dans un triangle. Les approches itératives ont tendance à masquer ces inexactitudes, car les erreurs sont accumulées uniformément pendant l’itération.

Le rastériseur de référence Direct3D utilise une approche d’évaluation directe pour l’informatique des index de texture à chaque emplacement de pixel. L’évaluation directe diffère de l’approche itérative dans laquelle toute inexactitude dans l’opération présente une distribution d’erreurs plus aléatoire. Le résultat est que les erreurs d’échantillonnage qui se produisent aux limites peuvent être plus visibles, car le rastériseur de référence n’effectue pas cette opération avec une précision parfaite.

La meilleure approche consiste à utiliser le filtrage au point le plus proche uniquement si nécessaire. Lorsque vous devez l’utiliser, il est recommandé de décaler légèrement les coordonnées de texture des positions de limite pour éviter les artefacts.

Filtrage de texture