retour à l'accueil dernière actualité articles interviews qcm dictionnaires bibliothèque forums inscription membre profile recherche sauvegardes contacts aides
entete 0titre de la page
menu du haut




Comprendre la 3D : le filtrage des textures
 Auteur : JF Maquiné Dernière révision : 17 Février 2002
Faire un commentaire :   0 message(s)








Introduction
   

Si vous êtes utilisateur de logiciels de jeux ou de dessin, vous avez certainement du lire ou entendre parler de bilinéaire, trilinéaire, bicubique, d'anisotropie, de MIP mapping, ... et vous vous posez un certain nombre de questions sur leur utilité et comment ils fonctionnent.

Toutes ces fonctions ont pour but d'améliorer la qualité d'affichage des textures, et plus particulièrement la qualité de rendu des couleurs, la couleur étant l'information de base de toutes les textures.

Bonne lecture.





Qu'est-ce que signifie : filtrage de texture ?
   

Le filtrage des textures consiste à appliquer un filtre à une texture. Ce filtre est en fait une fonction mathématique. Ainsi, quand on parle de filtrage bilinéaire, cela consiste à appliquer la fonction mathématique appelée bilinéaire à une texture.

Comment fait-on pour appliquer une fonction mathématique à une image ? En fait, une texture c'est une image composée de points (on parle de texel) auxquels on donne une valeur numérique qui correspond à une couleur. Le filtre va lire la valeur de la couleur de chaque point de la texture et la modifier pour produire une nouvelle texture.





A quoi ça sert le filtrage
   

Le filtrage de textures a pour but d'améliorer la qualité visuelle d'une texture. Ceci n'est pas lié au fait que les textures de base ne sont pas belles, au contraire, mais une texture peut subir et subit (surtout en 3D) des déformations. Ce sont ces déformations qui produisent une perte de qualité. Autrement dit, le filtrage des textures a pour but de palier à une perte de qualité graphique suite à une déformation.

- Une transformation c'est quoi ? C'est une fonction mathématique, comme le filtrage qui a pour but de déformer, réduire, agrandir, ... une texture.

- Pourquoi y a-t-il perte de qualité lors d'une transformation ? Une transformation modifie la définition d'une texture, c'est-à-dire le nombre de points qui la composent.

Au chapitre suivant, nous étudierons une transformation très importante en 3D, la mise en perspective. Mais avant ça, voyons un exemple d'agrandissement issu d'un screenshot d'Unreal2 : (screenshot)


Cliquez pour agrandir

Comme on peut le voir, le filtrage permet d'adoucir les contours qui ne sont en fait que des variations de couleurs. Le filtrage bicubique, bien connu des utilisateurs de Photoshop, est le plus performant. Dans les jeux 3D, on utilise le bilinéaire. Pourquoi pas le bicubique ? Comme nous le verrons dans les chapitres suivants, c'est une histoire de temps de calcul.

Remarque : L'image qui est commentée comme n'ayant pas de filtrage en possède un, il s'agit d'un filtrage linéaire. En fait, c'est lui qui génère les effets d'escalier (aliasing - Crénelage en français). On ne l'étudiera pas dans cet article vu qu'il n'est quasiment plus employé.





Représentation en perspective
   

Nous vivons dans un monde en 3 dimensions (3D). Tout objet qui s'y trouve peut être décrit par trois informations de base : hauteur, largeur, profondeur. Un logiciel 3D (jeux, ...) simule un monde 3D et tous les objets animés ou inanimés qui s'y trouvent ont une largueur, hauteur et profondeur. Le problème, c'est que notre écran lui n'affiche qu'une image 2D. Comment alors transformer une image 3D en 2D, sans perdre l'information d'une des dimensions ?

La réponse se nomme perspective. C'est un mode de représentation d'une scène 3D en une image 2D. Le principe consiste à effectuer une déformation des objets 3D qui nous permet de les transposer ensuite en 2D avec une illusion de profondeur. Voilà une image 2D avec effet de perspective :


Cliquez pour agrandir

Ce screenshot est issu du jeu Serious Sam. Les lignes blanches que j'ai tracé sont des lignes de fuite. Elles séparent les quatre principales parties de l'image (côtés gauche, droit, plafond et sol) et convergent toutes en 1 seul point. Pour construire une perspective, il suffit de :

1 - Prendre les extrémités de chaque surface des objets de la scène 3D.
2 - Fixer un point de convergence plus ou moins central à la scène.
3 - Tracer les lignes de fuite (imaginaire) partant des extrémités et converger vers le point de fuite.
4 - Déformer les surfaces des objets en respectant les proportions définies par les lignes de fuite.

On peut classer les déformations générées par la perspective, en deux groupes :
- Déformation uniforme : Elle respecte les proportions de l'objet. Un carré apparaîtra toujours comme un carré. Sa taille sera agrandie ou réduite en fonction de sa position dans la scène 3D.

- Déformation non-uniforme : Elle ne conserve pas les proportions. Un cercle devient une ellipse, et un carré, un trapèze.
Le choix de la déformation dépend de l'angle entre le 'point de vue' et les textures des objets. Si l'angle est de 90°, on effectue une déformation homogène (agrandissement ou réduction), sinon une déformation non-homogène.




Avec la perspective, il ne faut jamais oublier que la taille réelle des objets n'est jamais modifiée. Seule leur présentation sur une image 2D l'est ! De plus, la perspective n'est pas spécifique à l'informatique, les artistes peintres l'utilisent depuis des siècles.

A présent, je vais vous montrer un screenshot d'une image 3D qui a subit une mise en perspective (conversion 3D->2D), mais sans aucun filtrage.


Cliquez pour agrandir

Le moins que l'on puisse dire, c'est que cette image heurte l'oeil, et encore elle n'est pas animée. Si vous étiez en train de jouer, vous percevriez un scintillement très important, c'est-à-dire que les différents points qui constituent l'image se mettraient à 'clignoter' comme un arbre de Noël à chaque mouvement. Cette dégradation de qualité visuelle est entièrement générée par les transformations que nécessite la mise en perspective. C'est là qu'entrent en scène les filtrages, notamment le filtrage bilinéaire, qui vont permettre de polir un peu la scène pour que l'image soit plus agréable au regard.





Filtrage bilinéaire
   

D'un point de vue graphique, le filtrage bilinéaire consiste à adoucir les effets d'aliasing (crénelage). Nous avons déjà vu un exemple avec la mire de tir en début d'article. D'un point de vue mathématique, cela consiste à interpoler la couleur de quatre points de la texture pour trouver la couleur d'un cinquième point.


Que signifie 'interpoler' ? En mathématique, les points d'un graphique sont déterminés par une fonction, mais si on n'a que les points, il peut être intéressant de trouver une fonction qui y corresponde. C'est Lagrange (mathématicien français) qui a mis au point cet outil mathématique très utile. Dans le cas du filtrage bilinéaire, l'invention de Lagrange va nous permettre, à partir de points dont on connaît la couleur, de fabriquer une fonction qui va nous donner tout l'éventail des couleurs entre ces points. Il suffira de préciser à la fonction la position d'un point situé entre ces quatre points pour avoir sa couleur.

Le mot bilinéaire quant à lui, vient du fait qu'on va faire des interpolations linéaires dans un espace à 2 dimensions (selon l'axe des X et des Y). Une interpolation linéaire signifie qu'on va trouver une fonction linéaire à partir de 2 points. Cette fonction sera l'équation d'une droite.




Ce graphique montre que l'interpolation se fait en 2 phases :

1 - On fait une interpolation sur les points P1 -> P2 et P3 -> P4 selon l'axe des X. On obtient deux équations de droite. Le résultat de chacune de ces équations nous permet d'avoir 2 nouveaux points : P12 et P32.

2 - On refait une interpolation linéaire avec les points obtenus mais selon l'axe des Y. Le résultat final donne la valeur de la couleur du point.

Au total, on fait donc trois interpolations linéaires. Voici leurs équations :
P1,2 = d1 * P1 + d2 * P2
P3,4 = d1 * P3 + d2 * P4
P = d4 * P1,2 + d3 * P3,4
avec d2 = 1 - d1 et d4 = 1 - d3
A présent, voyons comment appliquer ces formules pour obtenir la couleur d'un point. Avec une texture, un point est défini par sa position (coordonnées x,y) ET sa couleur (c) tel que P(x,y,c). On va remplacer P1, P2, P3 et P4 par la valeur de la couleur de chacun de ces points. Les résultats P1,2, P3,4 seront donc des couleurs. Pour d1 et d4, c'est un peu plus compliqué, il s'agit de distance. Pour les définir, on utilise les coordonnées de chaque point de la façon suivante :
d1 = Px / (P2x - P1x)
d2 = 1 - Px
d3 = 1 - Py
d4 = Py / (P3y - P1y)
Px étant la valeur de la coordonnée x du point P, P1x la valeur de la coordonnée x du point P1, etc ... Faisons un exemple. On prendra comme couleur les nuances de gris avec noir = 0 et blanc = 255. Pour chaque point on a :
- P1(0,0,255)
- P2(1,0,230)
- P3(0,1,180)
- P4(1,1,0)
- d1 = 0,5/(1-0), d2 = 1 - 0,5 = 0,5
- d3 = 0,5/(1-0), d4 = 1 - 0,5 = 0,5

P1,2 = 0,5 * 255 + 0,5 * 230 = 242,5
P3,4 = 0,5 * 180 + 0,5 * 0 = 90
P = 0,5 * 242,5 + 0,5 * 90 = 166,25 (arrondi à 166)
La couleur du point P est donc 166. Voici le résultat graphique :





Filtrage bilinéaire (compléments)
   

La présentation du filtrage bilinéaire que j'ai faite laisse plusieurs questions en suspend :

Q1 - Pourquoi ne pas faire une moyenne des couleurs des quatre points au lieu d'une interpolation très compliquée.

Q2 - Comment fait-on un filtrage sur un format couleur RGBA ?

Q3 - Quelle est l'origine des formules mathématiques du filtrage bilinéaire ?

Q4 - Comment trouve-t-on les couleurs des autres cases dans l'exemple ?

Q5 - Dans le cas des bords d'une texture, on n'a pas 4 points. Comment fait-on ?


Question 1 :
Dans de nombreux articles, on peut lire que le filtrage bilinéaire consiste à faire la moyenne des couleurs. Ceci est vrai si la position du point P dont on cherche la couleur est bien à mi-distance des points P1, P2, P3, P4, sur les axes X et Y (figure A), mais ce n'est que rarement le cas (figure B).


Dans la figure A, on peut utiliser la moyenne ou l'interpolation pour déterminer la couleur du point P. Dans la figure B, seule l'interpolation permet d'avoir une bonne approximation de la couleur de P.

En fait, on parle de moyenne pour simplifier le discours afin d'expliquer le principe général du filtrage bilinéaire, sans entrer dans des détails mathématiques qui rebutent souvent les lecteurs. Toutefois, il m'a semblé qu'il était possible de présenter le filtrage bilinéaire en présentant directement la méthode d'interpolation. Celle-ci est plus générale et la moyenne n'est qu'un cas particulier de l'interpolation bilinéaire. J'espère avoir réussi, dans le cas contraire, faites-le moi savoir.

Question 2 :
L'exemple de filtrage bilinéaire donné en fin du chapitre précédent ne prenait en compte que des nuances de gris. Mais comment fait-on si on a un codage des couleurs selon 4 valeurs comme le RGBA (Red/rouge, Green/vert, Blue/bleu, Alpha/transparence). En fait, on va faire un filtrage bilinéaire pour chaque valeur. Donc, la détermination des valeurs RGBA d'un point implique de faire 4 filtrages bilinéaires.

Il est à noter qu'OpenGL gère mieux les couleurs que DirectX, quoique DX9 devrait être plus performant à ce niveau (utilisation de nombres flottants au lieu de nombres entiers). Cette différence entre OpenGL et DirectX explique en partie pourquoi beaucoup de professionnels apprécient la qualité du rendu des textures en OpenGL. Lors de filtrages, le fait de disposer d'une nuance plus importante limite la perte de précision des couleurs.

Question 3 :
Il existe une méthode générale de construction. C'est la formule d'interpolation de Lagrange. Vous trouvez de plus amples informations sur ce sujet dans des dictionnaires ou livres de mathématique jusqu'à ce que nous disposions de notre propre article sur le sujet :).

Question 4 :
Ce n'est pas vraiment un problème. Le tout est que vous ayez au moins quatre points de départ définis. Ensuite, on va utiliser les points définis et les points déjà interpolés pour trouver la couleur des autres.

Pour obtenir la couleur du point 'X', on effectue d'abord un filtrage bilinéaire pour déterminer 'a', puis 'b'. Ensuite, on effectue un filtrage avec les points a,b,c et d pour déterminer 'X'.

Il existe certainement des méthodes plus performantes que celles que je décris ici, mais au moins, celles-ci ont le mérite de vous montrer que c'est tout à fait faisable. D'ailleurs, si quelqu'un en connaît une, qu'il nous la présente, ça sera avec plaisir que je l'a publierais.

Question 5 :
Lorsqu'on est au bord d'une texture, il n'est pas toujours évident d'avoir 4 points pour faire une interpolation bilinéaire.


Il existe plusieurs solutions à ce problème, aucune n'est parfaite, puisqu'il s'agit de remplacer un point qui n'existe pas pour faire le filtrage bilinéaire.

- On prend le texel le plus proche de celui demandé (les bords de la texture donneront l'impression de s'étendre à l'infini)

- On demande une répétition de la texture. On considère la texture comme un plan 'Pacman', si l'on sort de la texture d'un coté, on réapparaît de l'autre. C'est le mode utilisé le plus souvent dans les jeux. (ex: la texture du sol dans Q3 n'est qu'une répétition d'une texture plus petite).

- On varie les deux premières méthodes tout en donnant un contour / bord à la texture.
- etc ...


Complément du 02/10/2002 :
Dans la pratique, les développeurs 3D ne se posent pas le problème de cette manière pour trouver la couleur d'un point à partir de 3 autres points au lieu de quatre. La solution pragmatique consiste simplement à mettre à 0 la valeur du coefficient du point manquant dans le groupe des quatre points servant à déterminer la couleur d'un cinquième.

Toutefois, il m'a semblé nettement plus intéressant pour les lecteurs non mathématiciens d'avoir une approche sous la forme de problème visuel, à résoudre. C'est un choix pédagogique.





Filtrage bicubique
   

Le filtrage bicubique comme le filtrage bilinéaire utilise la technique d'interpolation, mais la ressemblance s'arrête là. Bicubique signifie qu'on va faire des interpolations cubiques dans un espace à 2 dimensions, selon l'axe des X et des Y. Une interpolation cubique consiste à générer une fonction (3 ème degré) en se basant sur 4 points.




L'intérêt du filtrage bicubique est qu'il conserve mieux le contraste des couleurs que le filtrage bilinéaire, et génère moins de flou. Alors pourquoi ne pas l'utiliser avec les cartes graphiques ? Le problème est qu'un filtrage bicubique nécessite 10 fois plus de calculs qu'en bilinéaire, pour un gain en qualité graphique perceptible, mais léger. On le verra peut-être un jour dans les processeurs des cartes 3D, mais pas avant quelques années.

Je n'entrerais pas dans les détails comme je l'ai fait avec le filtrage bilinéaire, mais avant de terminer ce chapitre, je souhaiterais vous expliquer pourquoi un filtrage bicubique est plus efficace qu'un filtrage bilinéaire.

Dans la nature ou dans notre vie quotidienne, la majorité des éléments qui subissent une variation ne le font pas de façon linéaire ou autrement dit de façon régulière et constante. Cela ne veut pas dire qu'ils le font de façon bicubique, mais seulement qu'une représentation linéaire est une forme assez pauvre pour mathématiser les variations. En ce sens, l'interpolation cubique est plus proche de la réalité que l'interpolation linéaire (utilisée dans le filtrage bilinéaire) d'où la raison d'un meilleur résultat lors d'un filtrage de texture.





MIP mapping
   

Certains considèrent le MIP mapping comme une méthode de filtrage (ou pré-filtrage), mais c'est avant tout une méthode de gestion / organisation des textures. Le principe consiste à créer plusieurs versions d'une texture de base mais à des tailles différentes (comme les poupées russes). Cet ensemble de textures constitué à partir d'une texture de base se nomme le MIP map. Lorsqu'il faudra appliquer une texture à un polygone, on choisira une texture du MIP map dont la taille correspond au mieux au polygone. Le MIP mapping permet de faire deux choses :

- Diminuer l'effet d'aliasing généré lors de transformations. La qualité d'affichage est augmentée.

- Diminuer la quantité mémoire nécessaire pour effectuer le mapping de texture. La vitesse de traitement s'en trouve accrue.

Petit lexique des termes du MIP mapping.

- MIP map : Ensemble de textures constitué à partir d'une texture de base.

- MIP mapping : Opération consistant à appliquer une des textures du MIP map à un polygone (polygone en 3D = une des faces d'un objet).

- MIP : signifie 'Multum In Parvo'. C'est du latin et en français ça donne quelque chose comme 'plusieurs en 1 seul lieu'.

Création du MIP map

Pour utiliser le MIP mapping, on prend une texture de base. Puis on va créer une seconde texture qui correspondra au 1/4 de la texture de base, puis on recommence l'opération autant de fois que nécessaire. On obtient une suite de textures comme ci-dessous.


Exemple de MIP mapping

A présent, nous passons à la pratique en mappant (= appliquer des textures à une surface) la texture ci-dessus à un mur qui a subi une transformation en perspective. On peut voir sur le graphique ci-dessous la superposition des textures sur le mur (en gris) avant leur transformation pour coïncider exactement à la surface du mur. Le mur a à l'origine une taille égale à trois textures de base. C'est pour ça que j'utilise 3 textures de base dans le cas 'sans MIP mapping' et 3 textures du MIP map dans le cas 'avec MIP mapping'.


Cliquez pour agrandir

A présent, déformons les textures pour les faire coïncider avec la surface du mur déjà déformé, avec la méthode MIP mapping et sans. On obtient ceci :


Cliquez pour agrandir

La première chose qu'on remarque, c'est que dans le cas du MIP mapping, on obtient un bon résultat, alors que sans MIP mapping, les textures sont aliasées (crénelées) et ont l'air plutôt allongé. Pour ce dernier point, sans entrer dans les détails, je préciserais que les algorithmes informatiques, générant des effets de perspective, produisent tous un effet d'allongement. On appelle cela le défaut de perspective. On utilise pour ça une fonction qui se nomme la correction de perspective.

Nous venons de voir le côté 'gloire' du MIP mapping, voyons maintenant le côté 'décadence'. Nous allons analyser un screenshot du jeu Serious Sam montrant un mur en perspective avec MIP mapping et filtrage bilinéaire.


Cliquez pour agrandir

Qu'observe-t-on ? :

1 - On perçoit nettement les niveaux de MIP mapping (LOD), que j'ai séparé par une ligne noire.

2 - Il existe un flou important qui s'accentue avec le niveau de MIP mapping.
Que faut-il en conclure ?
1 - Le fait qu'on aperçoive une séparation nette entre les différents niveaux de MIP mapping ne milite pas en sa faveur. Tout ce qui apparaît discontinu, séquencé, haché dans une image 3D heurte l'oeil et donne une impression de rendu artificiel.

2 - Le flou est très important (trop). En fait, une grande partie du flou est générée par la technique du MIP mapping elle-même, et non par le filtrage. Cela est du au fait qu'on travaille sur des textures dont la taille a été réduite. Cela implique une perte d'information. Lorsqu'on transforme une telle texture réduite, puis qu'on applique un filtrage, on obtiendra invariablement un résultat plus flou que si on travaillait directement avec la texture de base.

A ces deux problèmes bien différents, on va trouver une solution, la première s'appelle le filtrage trilinéaire, la seconde, le filtrage anisotropique. Nous allons donc les étudier.





Filtrage trilinéaire
   

Le filtrage trilinéaire consiste à faire des interpolations linéaires dans un espace à 3 dimensions selon les axes X, Y et Z. On utilise donc les mêmes formules de base que le filtrage bilinéaire, ce qui implique que le filtrage trilinéaire n'est pas plus précis que le bilinéaire. Alors à quoi sert-il ?

Il permet d'éliminer, entre deux niveaux de MIP mapping, l'aspect discontinu des textures. Voici le screenshot du mur en perspective du jeu Serious Sam, mais avec filtrage trilinéaire :


Cliquez pour agrandir

Avant d'aborder la mise en pratique, regardons la représentation géométrique des filtrages bi et trilinéaire.


Comme on peut le voir, le filtrage bilinéaire s'effectue bien dans un plan (2 dimensions) et le trilinéaire dans un cube (3 dimensions). le nombre total d'interpolations linéaires étant de 7.

Toutefois, si ce graphique éclaircie bien les idées pour comprendre les différences entre bi et trilinéaire, il est plutôt trompeur quand on veut passer à la pratique dans le cas du filtrage trilinéaire avec MIP mapping. Effectivement, le schéma laisse à penser qu'on va déterminer la couleur d'un point P, situé entre deux points P' et P", chacun de ces points étant déterminés par un filtrage bilinéaire. En fait, il n'en est rien. Si on faisait comme ça, on obtiendrait un décalage (translation) des textures. Il nous faut donc voir en détail la méthode d'utilisation du trilinéaire avec le MIP mapping.

- On prend un point P d'une texture. Cette texture a un niveau de détail LOD = n.
- On prend un point P' de la même texture mais ayant un niveau de détail LOD = n-1.
- On détermine les couleurs de P et P' indépendamment, avec un filtrage bilinéaire.
- On fait une interpolation linéaire des couleurs de P et P'.
- On affecte le résultat à P.

Une des particularités du filtrage trilinéaire pour le MIP mapping, c'est que contrairement à la méthode générale que montre la présentation géométrique, on n'affecte pas le résultat final à un troisième P", mais à P.

Il existe une autre particularité et elle n'est pas des moindres. Si vous appliquiez la méthode telle qu'elle est décrite ci-dessus, vous n'obtiendriez pas la progressivité du flou. Pour l'obtenir, il faut faire varier l'importance de la valeur des couleurs des points P et P', lors de l'interpolation linéaire.


Cliquez pour agrandir

Quelques remarques pour terminer ce chapitre. Premièrement, le filtrage trilinéaire corrige parfaitement l'aspect discontinu des textures générées par le MIP mapping. Toutefois, il y a un revers, le filtrage trilinéaire coûte en temps de calcul et en bande passante (il est nécessaire de travailler sur 2 textures simultanément, au lieu d'une avec un filtrage bilinéaire). Ce coût annule en partie un des intérêts du MIP mapping à savoir, la diminution du nombre de calculs comme je l'ai expliqué en début de chapitre. Il ne reste donc au MIP mapping que le gain en qualité visuelle. Quoique ce gain reste tout relatif car le flou généré est particulièrement important. C'est là qu'intervient la notion isotropie et anisotropie. Et zouuuu ... chapitre suivant ;).





Explications de l'expression : LOD bias
   

Le 'LOD bias' est en fait un paramètre qui permet de modifier la manière dont le filtrage trilinéaire va utiliser les deux niveaux qu'il utilise pour donner une impression de continuité entre les textures. Ce paramètre est réglable parfois dans les jeux comme Quake 3, Serious Sam, ... ou dans les drivers comme les détonators de NVidia.

Comment ça marche ? Bias signifie : influencer, et LOD : niveau de détail (level of detail). En fait LOD bias permet de régler l'importance qu'on donne aux textures utilisées lors d'un filtrage trilinéaire. On parle en technique 3D de poids (importance) qu'on donne à une texture comparée à une autre.

Bien que la manière dont le réglage se fait est arbitraire, généralement la convention est que quand on augmente le LOD bias, on donne plus de poids à la plus petite texture du mip map et on obtient un effet de flou plus important (en anglais on parle de smooth pour le flou). Par contre, si on diminue le LOD bias, on augmente le poids de la texture la plus grande du mip map et un effet de pixelisation apparaît, donnant l'impression d'une plus grande netteté (en anglais on utilise le mot 'sharp' pour la netteté). Attention, j'ai dit une impression de netteté, mais en mouvement, la pixelisation est souvent insupportable, enfin en ce qui me concerne ;)

Voici deux screenshots tirés de Serious Sam 2, représentant la modification du LOD bias. Ce paramètre se trouve dans les options avancées sous le nom : taux d'erreur du niveau de détail des textures.


Cliquez pour agrandir



Cliquez pour agrandir





Filtrage anisotropique
   

Pour comprendre le filtrage anisotropique, il faut comprendre la problématique à laquelle ont été confrontés les chercheurs.

- Comment améliorer la netteté de l'image, sans remettre en cause le MIP mapping qui est le générateur de flou.

- Pourquoi ne peut-on pas le remettre en cause ? Car il est la seule solution viable pour les effets d'aliasing et de scintillement des images.

- Pourquoi le MIP mapping génère-t-il un flou ? Car la définition des textures diminue avec le niveau de détail.

La solution est apparue quand on s'est rendu compte que la perte de définition des textures n'était pas la seule cause de l'apparition d'un flou. L'explication est la suivante :

Dans le chapitre 'Perspective' nous avons vu que la majorité des déformations n'étaient pas homogène, c'est-à-dire qu'elles ne respectent pas les proportions des objets. Or, quand on fait un filtrage bilinéaire, on suppose implicitement que ces proportions sont préservées, puisqu'on utilise toujours quatre texels formant un carré. On dit que le filtrage bilinéaire est isotropique.



Sur le graphique ci-dessus, j'ai défini une zone de texel (symbolisée par un cercle gris) contenant par exemple quatre points servant à faire un filtrage bilinéaire. Lors d'une déformation anisotropique, le filtrage bilinéaire (isotropique) utilisera une zone de même forme (un cercle) alors qu'un filtrage anisotropique utilisera une zone déformée (une ellipse). Donc l'une des grandes idées du filtrage anisotropique est la suivante :

Il faut adapter, aux déformations qu'a subi la texture, la zone des points servant à faire les filtrages. Cette zone se nomme l'empreinte ou 'footprint' en anglais.

Mais le filtrage anisotropique ne se réduit pas seulement à adapter la zone de filtrage, en fonction de la déformation que la texture a subi, il utilise aussi une zone plus grande et prend en compte la direction de déformation comme le montrent les graphiques ci-dessous.


Cliquez pour agrandir

La taille de la zone dépend de la précision qu'on souhaite obtenir. On l'exprime soit par le nombre de filtrages bilinéaires nécessaires pour définir l'empreinte. Par exemple un filtrage anisotropique 4:1 signifie qu'on utilise 4 filtrages bilinéaires pour définir une zone, soit par le nombre de texels utilisés, renommés tape. Un filtrage anisotropique 64 tape signifie qu'on utilise 64 texels pour filtrer la couleur d'un seul point. C'est cette méthode qui est adoptée par les fabricants de cartes graphiques.

Filtrage anisotropique bilinéaire et trilinéaire
Un filtrage anisotropique trilinéaire effectue un filtrage anisotropique entre 2 niveaux de MIP map. Un filtrage anisotropique bilinéaire signifie qu'on fait un filtrage uniquement sur la texture déformée.

Il est intéressant de noter que si Nvidia, avec son processeur graphique NV20 (utilisé sur les GF3, TI-200/500), utilise un filtrage anisotropique trilinéaire, ATI de son côté, avec son processeur R200 (équipant l'ATI 8500), n'utilise qu'un filtrage anisotropique bilinéaire. A priori, on pourrait donc penser que sur les ATI, on verra apparaître les différents niveaux de MIP map comme avec le filtrage bilinéaire classique, et donc que la qualité du rendu sera moins bonne que sur les cartes graphiques de Nvidia.

En fait, la différence de qualité entre un filtrage anisotropique bilinéaire et trilinéaire est beaucoup plus faible qu'entre les filtrages bilinéaires et trilinéaires classiques. Pourquoi ? Ce qui génère l'aspect discontinu des textures dans le filtrage bilinéaire, c'est l'augmentation de flou d'un niveau de MIP map à un autre. Par contre, si on diminue le flou comme le fait le filtrage anisotropique, l'impression de discontinuité s'estompe. Elle s'estompe d'autant plus que le filtrage anisotropique est de qualité, et donc l'utilité d'un filtrage anisotropique trilinéaire ne s'impose plus. Donc si ATI utilise un filtrage anisotropique de qualité, le choix de ne faire qu'un filtrage anisotropique bilinéaire peut s'avérer justifié.





Filtrage anisotropique (compléments et documentations)
   

Il n'existe pas un filtrage anisotropique, mais plusieurs. Quasiment tous se basent sur une même méthode générale. Ce qui les différencie, c'est la façon dont cette méthode est mise en oeuvre. Evidemment, s'il existe plusieurs méthodes, cela signifie qu'on n'a pas encore trouvé la méthode parfaite. On peut classer les méthodes de filtrage anisotropique en deux camps. Celles qui s'attachent à la qualité avant tout. Ce sont des méthodes lourdes en calcul, impossible à mettre en oeuvre dans un processeur 3D pour un affichage temps réel. Et celles qui tentent de diminuer au mieux les calculs en minimisant la perte de qualité, afin d'être utilisables dans les processeurs 3D.

Avant de vous énumérer les différents filtrages anisotropiques, voici les points clef de la méthode générale :

- Détermination de la forme de l'empreinte. Tous les texels qui se trouvent dans les limites définies par l'empreinte seront pris en compte pour déterminer la couleur du point à filtrer. Pour faire un parallèle avec le filtrage bilinéaire classique, on pourrait dire que celui-ci utilise une empreinte carrée contenant quatre texels. En filtrage anisotropique, la forme de l'empreinte la plus efficace est proche de l'ellipse. La détermination de la forme de l'empreinte détermine les qualités générales du filtrage anisotropique. La taille de l'empreinte détermine le niveau de netteté que l'on souhaite obtenir.

- Détermination d'une méthode mathématique permettant d'affecter un poids à la couleur des texels contenus dans les limites de l'empreinte. Les poids jouent un rôle important dans les cas limites du filtrage anisotropique. Ces cas limites se produisent généralement quand l'angle entre le point de vue et la texture devient faible. S'ils sont mal traités par les algorithmes mathématiques du filtrage, alors des effets indésirables apparaissent comme le moiré ou la pixelisation.

- Détermination correcte du niveau de MIP map. Il arrive parfois que deux niveaux de MIP map (texture du MIP map) puissent être utilisés pour être appliqués à une face d'un objet. Si l'algorithme tranche en faveur du niveau ayant la plus grande texture, on augmentera la qualité, mais au détriment de la vitesse. Il appartient donc au chercheur d'utiliser un algorithme adapté à l'objectif de la méthode.



Présentation rapide des différents filtrages anisotropiques connus

EWA : Elliptical Weighted Average
C'est la méthode de référence en terme de qualité. Elle consiste à définir une empreinte elliptique, qui entoure le point dont on doit déterminer la couleur. Ensuite, on affecte un poids (= une importance) à chaque couleur de texel intégrée dans cette ellipse. Le plus petit axe de l'ellipse a une taille comprise entre 2 et 4 texels.

EWA n'est pas implanté actuellement dans des processeurs 3D, à cause d'une quantité de calcul trop important. Cette technique n'est d'ailleurs pas exempte de défauts et de nombreux algorithmes plus récents proposent des solutions.

Footprint Assembly : TEXRAM
C'est une méthode qui fait une approximation une empreinte elliptique en associant plusieurs parallélogrammes. Comparée à EWA, c'est une méthode qui nécessite beaucoup moins de calculs, mais avec une qualité moindre. Toutefois, la majorité des processeurs 3D actuels utilisent cette technique ou une proche variante comme Talisman de Microsoft. La principale faiblesse de cette méthode est de gérer de façon trop simple les poids affectés au texel de l'empreinte.

Feline : Fast Elliptical LINE
FELINE tente de prendre le meilleur des deux méthodes EWA et TEXRAM. Comme TEXRAM, elle fait une approximation de l'empreinte elliptique, mais en utilisant plus de parallélogrammes et un algorithme d'affectation des poids aux texels plus sophistiqué. Elle est censée offrir une meilleure qualité d'image. Malheureusement, dans la réalité, il semble que FELINE produise globalement un résultat de qualité inférieure à TEXRAM en effectuant plus de calculs, sauf dans des cas particuliers tels que le filtrage de texte.


Fast Footprint Assembly
C'est une variante de la technique TEXRAM qui adapte de façon dynamique son algorithme en fonction des spécificités du matériel telle que la bande passante mémoire de la carte graphique.

Talisman : Microsoft
Variante de TEXRAM dont le brevet a été déposé, ce qui rend difficile l'obtention d'informations sur cette méthode. Apparemment, elle aurait été intégrée dans DirectX (dès sa version 6 ?).

SPAF : Sub-texel Precision Anisotropic Filtering
Si les informations que nous donnent les auteurs sont exactes, alors cette méthode a un bel avenir. Tout comme FELINE, elle tente de prendre le meilleur des méthodes EWA et TEXRAM, mais en y arrivant nettement mieux. L'empreinte elliptique est approximée par des parallélogrammes. Mais au lieu d'utiliser tous les points de ce parallélogramme, ils vont définir dans ce parallélogramme, un quadrilatère qui a la forme de la texture déformée. Cela permet de réduire le nombre de texels à filtrer. Ce gain en nombre de calculs sert à utiliser une méthode d'affectation des poids plus sophistiquée que celle de TEXRAM.

Apparemment, cette méthode offrirait une bien meilleure qualité que TEXRAM tout en utilisant moins de bande passante, qui plus que le temps de calcul est le premier frein à l'adoption d'une méthode de filtrage anisotropique.


RIP-anisotropique
En fait, cette méthode n'utilise absolument pas la méthode globale de filtrage anisotropique présentée en début de chapitre. Mais il m'a semblé intéressant de la présenter parce que justement elle montre qu'il n'existe pas une seule voie de recherche dans la détermination d'une méthode de filtrage anisotropique parfaite.

L'idée de base du RIP-mapping, c'est d'utiliser un double MIP map. Le premier MIP map consiste à réduire la taille de la texture de base uniquement selon l'axe X, le second MIP map uniquement selon l'axe des Y. Le choix du MIP map X ou Y est déterminé par la longueur maximale de la déformation de la texture. si c'est selon l'axe des X, on prend le MIP map X, sinon Y.

Cette méthode n'est pas à proprement parlé un filtrage anisotropique, mais plutôt un MIP mapping anisotropique. Toutefois, il y a à mon sens une petite supercherie, car le gain en qualité est en partie du au fait que chaque texture des MIP map X et Y dispose d'une définition 2 fois supérieure à un MIP map classique.

A ma connaissance, cette méthode n'est pas utilisée, d'une part parce qu'elle consomme beaucoup de bande passante mémoire, d'autre part, dans le cas où la direction de déformation est oblique, le gain en netteté est faible.



Summed Area
Je n'ai presque aucune information sur cette méthode, mais il semble qu'elle fut l'une des toutes premières. Je l'ai cité dans l'espoir que quelqu'un, qui connaîtrait bien sa mise en oeuvre, puisse nous la communiquer. Merci d'avance.





Exercice
   

Lorsque l'on fait un filtrage bilinéaire sur une texture de MIP mapping, un effet visuel a priori étrange apparaît. Cet effet consiste dans fait la partie la plus éloignée d'une texture d'un niveau de MIP map est plus nette que la partie la plus proche.

Cet effet est très léger et perceptible uniquement dans certaines situations, mais il existe bel et bien. A quoi est-il du ?





Les différents filtrages avec Quake 3
   

En modifiant la variable 'r_textureMode' du fichier 'config.cfg', il est possible de voir les différents types de gestion des textures dans Quake 3. Voici les différentes valeurs que peut prendre cette variable.

GL_NEAREST : Sans filtrage, sans MIP mapping.
GL_LINEAR : Filtrage bilinéaire, sans MIP mapping.
GL_NEAREST_MIPMAP_NEAREST : Sans filtrage, avec MIP mapping.
GL_LINEAR_MIPMAP_NEAREST : Filtrage bilinéaire, avec MIP mapping.
GL_LINEAR_MIPMAP_LINEAR : Filtrage trilinéaire, avec MIP mapping.


Il existe un autre paramètre très intéressant à modifier. Il s'agit de : 'r_colormiplevels'. Il permet de voir en fausse couleur les différents niveaux de MIP map durant une partie. Vous pourrez ainsi vous apercevoir que les niveaux de MIP map ne sont pas seulement fonction de la distance, mais aussi de l'angle que la texture fait avec votre point de vue.

Si la variable n'existe pas, vous pouvez l'ajouter en faisant : seta r_colormiplevels "1"





Conclusion
   

D'un point de vue technique, les filtrages ou le MIP mapping ne sont pas des obligations, mais d'un point de vue esthétique c'est impératif. Toutefois on peut encore trouver des jeux qui ne gèrent pas de MIP mapping sur les PC comme 'Ghost Recon'. A chacun d'apprécier l'aspect visuel, mais si sans MIP mapping on peut avoir l'impression d'une plus grande netteté, il ne s'agit là que d'une impression qui se fait dans tous les cas au dépend d'autres aspects, tels que le scintillement.

Concernant le filtrage anisotropique, on peut le considérer comme une forme d'aboutissement du filtrage de texture. D'ici 2 à 3 ans, la majorité des cartes graphiques qui seront vendues dans le commerce pourront faire du filtrage anisotropique de grande qualité sans perte de performance notable. Il est à noter que le filtrage anisotropique n'est plus seulement une solution au flou généré par la technique de MIP mapping, mais aussi au flou généré par les techniques de FSAA (antialiasing sur une scène 3D complète). Attention, par solution il faut comprendre que le filtrage anisotropique ne corrige pas les défauts du FSAA, mais en proposant une texture mieux filtrée, plus nette, le résultat du FSAA sera moins flou. Mais bon, ceci est une autre histoire et le FSAA fera l'objet d'un article bien distinct.

Je tiens à remercier tout particulièrement Mr Fautré Tanguy qui a accepté de faire office de comité de relecture pour cet article. Ceci dit, que cela n'empêche pas d'autres esprits avisés d'en faire autant :).

P.S: J'ai eu les plus grandes difficultés à collecter des informations sur les filtrages anisotropiques. J'invite donc toute personne ayant une expérience, ou des documents pertinents sur le sujet à prendre contact avec moi afin d'améliorer cet article.

Remarque (17/02/2002) :
Un lecteur sur le forum m'a signalé (merci Texto) l'existence d'un patch pour Ghost Recon permettant d'exploiter le Mip Mapping. Comme quoi cette technologie a son utilité :).

Remerciement (04/10/2002) :
Je tiens à remercier Grégory Massal pour ses commentaires 'pointilleux' ;) , qui m'ont permis de faire un certain nombres de mises au point et améliorations.




YOUM
(analyseur syntaxique temps réel)
Nombre de définitions trouvées
114
Multi-dico par texte : actif   -   Multi-mots par définition : 4






fonction
menu de droite
fin de menu

qcm du mois
Télescope spatial Hubble
fin qcm


Page générée en : 0.009 secondes
ligne
Technologies Onversity : Hydrogen 1.0 (moteur de base de données) - SE.EN 1.0 (moteur de recherche) - YOUM 2.0 (analyseur syntaxique temps réel)
Tous droits réservés à Jean-François MAQUINÉ
ligne