Partager via


échantillonnage Nearest-Point (Direct3D 9)

Les applications ne sont pas tenues d’utiliser le filtrage de textures. Direct3D peut être défini de sorte qu’il calcule l’adresse du 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 au point le plus proche. Il peut s’agir d’un moyen rapide et efficace de traiter des textures si la taille de la texture est similaire à la taille de l’image de la primitive à l’écran. Si ce n’est pas le cas, la texture doit être agrandie ou réduite. Le résultat peut être une image segmentée, avec alias ou floue.

Votre application C++ peut sélectionner l’échantillonnage le plus proche en appelant la méthode IDirect3DDevice9::SetSamplerState . Définissez la valeur du premier paramètre sur le numéro d’index entier (0-7) de la texture pour laquelle vous sélectionnez une méthode de filtrage de texture. Passez D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER ou D3DSAMP_MIPFILTER pour le deuxième paramètre afin de définir le filtre d’agrandissement, de réduction ou de mipmapping. Passez D3DTEXF_POINT dans le troisième paramètre.

Vous devez utiliser l’échantillonnage du point le plus proche avec précaution, car il peut parfois provoquer des artefacts graphiques lorsque la texture est échantillonné à 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 changer brusquement d’un texel au texel suivant à mesure que la limite est franchie. Cet effet peut apparaître sous forme d’artefacts graphiques indésirables dans la texture affichée. Lorsque le filtrage linéaire est utilisé, le texel résultant est calculé à partir des deux texels adjacents et se mélange facilement entre eux à mesure que l’index de texture se déplace à travers la limite.

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

Dans la plupart des cas, les applications obtiennent les meilleurs résultats en évitant l’échantillon le plus proche dans la mesure du possible. La majorité du matériel étant aujourd’hui optimisé pour le filtrage linéaire, votre application ne doit pas souffrir de performances dégradées. Si l’effet que vous souhaitez nécessite absolument l’utilisation de l’échantillonnage au point le plus proche, par exemple lorsque vous utilisez des textures pour afficher des caractères de texte lisibles, votre application doit être extrêmement prudente pour éviter l’échantillonnage aux limites du texel, ce qui peut entraîner des effets indésirables. L’illustration suivante montre à quoi ces artefacts peuvent ressembler.

illustration d’une zone à six sections avec des lignes horizontales non continues dans les deux carrés supérieurs droit

Notez que les deux carrés dans le coin supérieur droit du groupe apparaissent différents de leurs voisins, avec des décalages diagonales qui les traversent. Pour éviter de tels artefacts graphiques, vous devez être familiarisé avec les règles d’échantillonnage de texture Direct3D pour le filtrage au point le plus proche. Direct3D mappe une coordonnée de texture à virgule flottante allant de [0.0, 1.0] (0.0 à 1.0, inclus) à une valeur d’espace de texel entier 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 un exemple simple, imaginez une application qui restitue des polygones avec le mode d’adressage de texture D3DTADDRESS_WRAP. À l’aide du mappage utilisé par Direct3D, l’index de texture u est mappé comme indiqué dans le diagramme suivant pour une texture d’une largeur de 4 texels.

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

Notez que 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 texel 0 pour un index de texture de 1,0. Toutefois, si la coordonnée de texture était légèrement inférieure à 1,0, le texel échantillonné serait le n texel au lieu du texel 0.

Cela implique que l’agrandissement d’une petite texture à l’aide de coordonnées de texture exactement 0,0 et 1,0 avec filtrage du point le plus proche sur un triangle aligné sur l’espace d’écran entraîne des pixels pour lesquels la carte de texture est échantillonnées à la limite entre les texels. Toute inexactitude dans le calcul des coordonnées de texture, même si elles sont petites, entraîne des artefacts le long des zones de l’image rendue qui correspondent aux bords du texel de la carte de texture.

L’exécution de ce mappage de coordonnées de texture à virgule flottante avec des texels entiers avec une précision parfaite est difficile, fastidieuse et généralement pas nécessaire. La plupart des implémentations matérielles utilisent une approche itérative pour le calcul des coordonnées de texture à chaque emplacement de pixels 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 le calcul des index de texture à chaque emplacement de pixels. L’évaluation directe diffère de l’approche itérative en ce que 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 perceptibles, 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 du point le plus proche uniquement lorsque cela est nécessaire. Lorsque vous devez l’utiliser, il est recommandé de décaler légèrement les coordonnées de texture des positions limites pour éviter les artefacts.

Filtrage des textures