Pour comprendre la nature du filtrage anisotrope, vous devez bien comprendre ce que signifie réellement le mappage de texture.
Le terme "mappage de texture" signifie affecter des positions sur un objet à des emplacements dans une texture. Cela permet au rasterizer / shader de récupérer, pour chaque position sur l'objet, les données correspondantes de la texture. La méthode traditionnelle consiste à attribuer à chaque sommet d'un objet une coordonnée de texture, qui mappe directement cette position à un emplacement dans la texture. Le rasterizer interpolera cette coordonnée de texture sur les faces des différents triangles pour produire la coordonnée de texture utilisée pour extraire la couleur de la texture.
Maintenant, réfléchissons au processus de pixellisation. Comment ça marche? Il prend un triangle et le décompose en blocs de la taille d'un pixel que nous appellerons des "fragments". Maintenant, ces blocs de taille pixel sont de taille pixel par rapport à l'écran.
Mais ces fragments ne sont pas de la taille d'un pixel par rapport à la texture. Imaginez si notre rastériseur générait une coordonnée de texture pour chaque coin du fragment. Imaginez maintenant dessiner ces 4 coins, non pas dans l'espace écran, mais dans l' espace texture . Quelle forme cela aurait-il?
Eh bien, cela dépend des coordonnées de la texture. Autrement dit, cela dépend de la façon dont la texture est mappée au polygone. Pour tout fragment particulier, il peut s'agir d'un carré aligné sur l'axe. Il peut s'agir d'un carré non aligné sur l'axe. Ce pourrait être un rectangle. Ce pourrait être un trapèze. Ce pourrait être à peu près n'importe quelle figure à quatre côtés (ou au moins, des figures convexes).
Si vous utilisiez correctement l'accès à la texture, le moyen d'obtenir la couleur de texture d'un fragment serait de comprendre ce qu'est ce rectangle. Ensuite, récupérez chaque texel de la texture dans ce rectangle (en utilisant la couverture pour mettre à l'échelle les couleurs qui sont sur la bordure). Ensuite, faites-les tous ensemble. Ce serait une cartographie de texture parfaite.
Ce serait également extrêmement lent .
Dans l'intérêt de la performance, nous essayons plutôt d'approcher la vraie réponse. Nous basons les choses sur une coordonnée de texture, plutôt que sur les 4 qui couvrent la zone entière du fragment dans l'espace texel.
Le filtrage basé sur Mipmap utilise des images de résolution inférieure. Ces images sont essentiellement un raccourci pour la méthode parfaite, en pré-calculant à quoi ressembleraient de grands blocs de couleurs lorsqu'ils sont mélangés. Ainsi, lorsqu'il sélectionne un mipmap inférieur, il utilise des valeurs précalculées où chaque texel représente une zone de la texture.
Le filtrage anisotrope fonctionne en rapprochant la méthode parfaite (qui peut et doit être couplée à la cartographie par mip) en prenant jusqu'à un nombre fixe d'échantillons supplémentaires. Mais comment détermine-t-il la zone dans l'espace texel à extraire, car elle n'a toujours qu'une seule coordonnée de texture?
Fondamentalement, il triche. Étant donné que les shaders de fragments sont exécutés dans des blocs voisins 2x2, il est possible de calculer la dérivée de n'importe quelle valeur dans le shader de fragments dans l'espace d'écran X et Y. Il utilise ensuite ces dérivées, couplées à la coordonnée de texture réelle, pour calculer une approximation de quelle serait l'empreinte de texture du vrai fragment. Et puis il effectue un certain nombre d'échantillons dans cette zone.
Voici un schéma pour l'expliquer:
Les carrés en noir et blanc représentent notre texture. C'est juste un damier de 2x2 texels blancs et noirs.
Le point orange est la coordonnée de texture du fragment en question. Le contour rouge est l'empreinte du fragment, qui est centrée sur les coordonnées de la texture.
Les cases vertes représentent les texels auxquels une implémentation de filtrage anisotrope pourrait accéder (les détails des algorithmes de filtrage anisotrope sont spécifiques à la plate-forme, je ne peux donc expliquer que l'idée générale).
Ce diagramme particulier suggère qu'une implémentation pourrait accéder à 4 texels. Oh oui, les cases vertes couvrent 7 d'entre elles, mais la case verte au centre pourrait être récupérée à partir d'une mipmap plus petite, récupérant ainsi l'équivalent de 4 texels en une seule extraction. L'implémentation pèserait bien sûr la moyenne de cette extraction de 4 par rapport à celles du texel unique.
Si la limite de filtrage anisotrope était de 2 plutôt que de 4 (ou plus), alors l'implémentation choisirait 2 de ces échantillons pour représenter l'empreinte du fragment.