|
| Les différentes formes d'aliasing et leurs solutions | | Auteur : JF Maquiné | Dernière révision : 15 Juillet 2005 |
|
| | |
Si l'on traduit le terme d'aliasing en français cela donne crénelage, c'est-à-dire l'apparition d'un effet escalier sur le bord des objets. L'anti-aliasing étant le remède à ce phénomène. Mais l'anti-aliasing a une vocation plus générale que de résoudre le seul effet d'escalier. On peut citer par exemple le 'pixel popping'. On a aussi différents problèmes qui ne requièrent pas tous la même solution d'anti-aliasing, comme l'aliasing de textures, des textures alpha, des shaders. L'aliasing est devenu un terme générique pour les problèmes générés par un manque de définition (nombre de pixels) et plus généralement d'informations. Ce sont ces différentes formes d'aliasing et leurs solutions que nous allons aborder de même que l'explication de techniques particulières comme le MSAA ou le SSAA. A propos, vous entendez souvent le terme FSAA, celui-ci est devenu en fait le terme générique pour les solutions d'anti-aliasing.
Pour vous donner tout de suite une idée du sujet de l'article, voici deux exemples. Le premier est un exemple de pixel popping dans le jeu Mafia et le second d'aliasing géométrique dans FarCry.
La première image montre l'aliasing le plus connu car le plus voyant dans un jeu. Le second se rencontre lorsqu'on a affaire à des objets fins comme du grillage, mais aussi des câbles (électrique, téléphonique). Tous ces types de problèmes ont aujourd'hui leurs solutions.
Bonne lecture |


| | |
Dire que l'anti-aliasing consiste à utiliser plus d'informations pour solutionner l'aliasing est un peu théorique. Dans la pratique, que se passe-t-il ? L'anti-aliasing consiste à niveler par un dégradé de couleurs progressif chaque crénelage. Ce qui a pour effet (optique) de donner l'impression d'une continuité. Voici un exemple tiré du jeu BF2, ainsi qu'un zoom d'une zone aliasée et la même anti-aliasée. La première image montre une gru dans le jeu Battle Field 2 qui a subit un anti-aliasing de niveau 6 et un important zoom d'une partie de cette gru montrant comment le bord est nivellé pour donner l'illusion de continuité.
|

| | |
SSAA
Le SSAA pour Super Sampling Anti Aliasing est la meilleure méthode d'anti-aliasing dont nous disposons techniquement car elle filtre tout. Comme nous le verrons, elle filtre les bords des objets, l'intérieur des textures, les textures Alpha, ... Le problème c'est qu'elle consomme une énorme quantité de ressources qui la rendent, aujourd'hui encore même avec des cartes comme la 7800GTX de NVidia, difficile à utiliser sans une perte vertigineuse des FPS.
Elle repose sur un principe simple. Puisque l'aliasing est avant tout du à un manque d'informations, on augmente la définition de l'image puis on applique un filtre pour effectuer l'anti-aliasing. Dans un FSAAx4 par exemple on multiplie par 4 le nombre d'informations en rendant l'image 2 fois plus grande sur l'axe des X et 2 fois plus grande sur l'axe des Y. En pratique cela signifie que pour chaque pixel, on dispose à présent de 4 pixels dont on va faire la moyenne pour estimer la couleur. On nomme ces 4 pixels provisoires des échantillons. Dans le cas du FSAA, on a 4 échantillons pour 1 pixel final, pour le FSAAx6 on en a 6, etc ...
En théorie on utilise 4 fois plus de mémoire et 4 fois plus d'opérations pour filtrer la texture. En pratique due à la compression des textures, on n'utilise pas vraiment 4 fois plus de mémoire, mais la chute de performances reste quand même importante.
En résumé le SSAA consiste à : - Calculer l'image 3D dans une résolution double (axe X et Y) de la résolution finale souhaitée
- Ramener l'image à la taille demandée en effectuant un filtrage particulier
On nomme parfois le SSAA l'oversampling. En fait originellement on appelait la méthode consistant à augmenter la taille de l'image l'oversampling. Ensuite sont apparues des variantes en particulier au niveau de la méthode de filtrage et on a donné à ces méthodes le terme générique de SSAA. L'oversampling correspond aujourd'hui à un SSAA ayant une méthode de filtrage très basique de type OGSS que nous verrons plus loin dans l'article.
MSAA Le MSAA pour MultiSampling Anti-Aliasing est une technique qui a pour but de proposer de l'anti-aliasing mais sans avoir l'impact en terme de performance qu'a le SSAA. Comment ? Tout simplement en effectuant l'anti-aliasing que là où ça se voit le plus à savoir le bord des objets. Le reste ne subissant qu'aucune modification au contraire du MSAA. On nomme parfois le MSAA par un terme plus générique le 'Edge' FSAA, se traduisant par le FSAA de contour.
Le MSAA est bien une technique de supersampling c'est-à-dire qu'on travaille avec une image n fois plus grande, mais là s'arrête la similitude. Le MSAA a une méthode très particulière de faire son filtrage dans son principe que nous allons voir.
Le MSAA ne joue que sur l'aliasing de géométrie. La géométrie des objets est construite par des triangles dans lesquels on place les textures. Le MSAA ne s'occupe que de ce qui se passe aux bords de ces triangles.
Le mode opératoire est le suivant pour le MSAAx4 :
- on double la taille de l'image
- on groupe les échantillons (pixels) par groupe de 4.
- on calcule la couleur moyenne des quatre échantillons
- on teste pour chaque échantillon s'il intersecte le bord du triangle et on définit la transparence du pixel final en fonciton du résultat.
- si aucun pixel ne touche le bord, la transparence vaut 100%.
- si 1 touche le bord on applique une transparence de 75%
- si 2 touchent le bord on applique une transparence de 50%
- si 3 touchent le bord on applique une transparence de 25%
- si 4 touchent le bord on applique une transparence de 0% (on applique donc totalement la couleur moyenne calculée précédemment).
|

| | |
Le FAA pour Fragment Anti-Aliasing est une technique de edge-FSAA comme le MSAA. Le FAA s'est fait connaître lorsque Matrox l'a intégré à ses cartes graphiques Parhelia. Sans entrer dans le détail, le FAA fonctionne de manière assez similaire au MSAA sauf qu'il utilise un masque pour déterminer les pixels qui sont intersectés par le triangle et ceux qui ne le sont pas et le résultat de ce masque (qui contient des 1 et des 0) est utilisé par la suite. L'intérêt principal du FAA est que en FSAAx4, un MSAA a besoin de 4 fois plus de mémoire pour le framebuffer, le FAA en a besoin seulement de 1,5 fois plus. La baisse de performance est donc assez faible avec le FAA. Ceci permet d'utiliser un anti-aliasing plus important de type FSAAx16
Alors pourquoi tous les constructeurs ne l'adoptent pas ? Parce que le principe même du FAA implique soit des contraintes d'utilisation pour les développeurs 3D pour éviter que certains contours ne soient pas anti-aliasés, de même le FAA pose des problèmes aux intersections des triangles qui forment la géométrie des objets d'une scène 3D.
Voici un exemple de FAA :
Le terme de fragment provient du fait que dans le cas du MSAA ou du SSAA, chaque échantillon est constitué de deux informations. La couleur est sa profondeur dans la scène 3D. Le FAA n'utilise et ne stocke qu'une fraction de ces informations d'ou Fragment Anti-Aliasing. |


| | |
Le temporal AA n'est pas une technique particulière de FSAA comme le MSAA, le SSAA ou le FAA. Il consiste, à partir d'une technique de FSAA, à calculer et afficher une première partie du FSAA, puis à l'image suivante la seconde partie du FSAA. Cette technique fonctionne en étant basée sur la persistance rétinienne, si les images défilent assez vite vous aurez l'illusion d'un FSAAx4 (par exemple) alors que le travail effectué correspond à celui d'un FSAAx2.
Il y a quand même des restrictions. D'abord persistance rétinienne ou non, c'est un peu moins bon que de rendre complémentaire la totalité du FSAA dans une image. Ensuite il faut avoir un bon framerate, c'est-à-dire une vitesse de défilement des images suffisante pour que l'oeil se laisse tromper, dans le cas contraire un temporal AAx4 ressemble à peine à un FSAAx2. En gros en dessous de 50 fps le temporal AA n'est pas très intéressant. Il faut encore ajouter qu'avec le temporal AA il est préférable d'activer la synchronisation verticale pour obtenir le meilleur résultat, ce qui malhesuement tend à faire baisser le FPS moyen.
L'idée n'est pas nouvelle, et c'est ATI qui l'a mise en oeuvre dans ses drivers depuis environ 1 an. A l'origine dédiée pour sa nouvelle génération X800 de cartes graphiques, cette technologie a été étendue à sa gamme 9700 et 9800.
Le temporal AA est très adpaté a des techniques de edge-FSAA (MSAA, FAA). Dans le cas du SSAA, on risque d'avoir un effet désagréable de clignotement de l'ensemble de la scène. |



| | |
Lorqu'on fait le placage des textures sur un objet, on doit effectuer généralement une déformation de la texture (étirement, cisaillement, ...). Cette opération de déformation provoque l'apparition d'aliasing tel qu'on peut le voir sur l'image suivante :
 On peut se demander pourquoi il y a nécessité à déformer les textures. Il faut remonter à la source de la création des textures. Celles-ci sont faites par les designers du jeu. Ils font un fichier pour chaque texture. Charge ensuite à la carte 3D de faire les déformations nécessaires pour faire entrer la texture dans la face de l'objet. Les faces des objets varient en fonction des angles de vue et il y en a quasiment une infinité. On ne peut pas produire une infinité de textures pour chaque déformation possible. Si on pouvait le faire, on n'aurait pas la nécessité de déformer les textures, mais ce n'est pas le cas d'où les nécessaires déformations et donc apparition d'aliasing dans les textures.
Il y a une bonne et une mauvaise nouvelle avec cet aliasing. La bonne nouvelle c'est que l'aliasing n'est perceptible que s'il y a des dessins avec des bords nets, ce qui n'est pas si courant que ça en moyenne dans les jeux, mais ce n'est pas rare non plus. La mauvaise nouvelle c'est qu'il n'existe qu'une technique pour solutionner ce problème (l'augmentation de résolution n'ayant aucun effet ici) et que cette solution produit elle-même un inconvénient. Cette technique est le SSAA. Elle effectue un anti-aliasing sur l'ensemble de la scène ce qui inclut les textures, mais aussi les bords des objets. A priori c'est une technique supérieure au MSAA. En pratique pas vraiment car elle produit un léger flou sur les textures. Or comme les utilisateurs sont assez sensibles à la netteté des textures, les constructeurs de cartes graphiques lui ont préféré le MSAA qui, s'il n'apporte par une solution d'ensemble, améliore suffisamment la qualité globale de l'image pour être considéré comme supérieur. Il y a une autre raison au fait que pour l'instant le MSAA ait été préféré au SSAA. Il consomme nettement moins de ressource et en particulier de bande passante. Effectivement le SSAA est une technique tueuse de FPS.
Alors le SSAA inutile ? Des cartes comme les 8500 d'ATI utilisaient la technique de SSAA mais plus que le problème des performances, la technique a été fortement critiquée pour le flou qu'elle générait sur l'ensemble des textures. Le plus gênant c'est que plus on utilise un anti-aliasing fort, plus le flou est important. Des tentatives d'améliorations des algorithmes du SSAA ont été faites, mais toutes se sont révélées quand même insuffisantes face à ce problème de flou. Toutefois cela ne signifie pas qu'elle ne sera jamais utilisée. L'astuce qui semble se dessiner pour l'avenir c'est qu'on l'utilisera conjointement avec le MSAA qui restera le premier mode anti-aliasing et ce quel que soit le niveau d'anti-aliasing qu'il produit. Pour le SSAA il est envisagé de l'utiliser pour effectuer de petites corrections aliasing. |


| | |
Le MSAA est une solution qui en pratique donne des résultats suffisants, sauf sur certains points comme les textures alpha. La solution serait d'utiliser le SSAA, mais ça consomme trop. Comment faire pour résoudre le problème des textures transparentes ? Il suffit simplement que le processeur puisse clairement distinguer les textures alpha des autres et qu'il soit capable d'appliquer le SSAA uniquement à ces textures. C'est possible ? oui NVidia l'a fait et le résultat est probant. Voici un exemple tiré du jeu Half-Life 2 ou on voit une image sans anti-aliasing sur les textures alpha des grillages et avec.
Le problème c'est que les performances varient rapidement avec le nombre de textures alpha utilisées dans une scène. L'idéal serait de disposer d'un mode MSAA pour la transparence et la 7800 GTX en dispose bien d'un mais malheureusement il ne fonctionne que sous certaines conditions qui ne sont que rarement satisfaites. On peut envisager qu'à l'avenir les futurs jeux fassent en sorte que ces conditions soient remplies mais c'est un peu plus complexe que ça. En premier il faudra voir ce que proposera ATI. Faire un jeu pour un constructeur c'est toujours gênant. En second il existe en fait une solution purement logiciel à l'utilisation du MSAA et des textures transparentes. Une solution tellement simple et efficace que beaucoup de personnes se demandent aujourd'hui pourquoi personne ne l'a jusqu'à présent utilisée. |

| | |
Suite à une discussion sur les forums de Beyond3D, humus, un développeur de démo technologiques, a réalisé une démo montrant deux méthodes pour obtenir un anti-aliasing sur les textures alpha associées à du MSAA. Le résultat est probant avec un coût en FPS assez faible. Alors c'est la solution miracle ? Non, et ce pour deux raisons. La première c'est que la qualité du FSAA produit, si elle est satisfaisante, n'égale pas celle utilisant le SSAA. La seconde plus difficile à accepter, c'est qu'elle grossit les traits des éléments que les textures alpha sont censées représenter.
Si dans le cas du grillage, ça passe c'est parce que le grillage présente une géométrie assez aérée. Par contre si on devait représenter une grille ayant de fins interstices alors cette technique tendrait à couvrir les interstices et ce n'est plus une grille qu'on verrait mais une plaque. |

| | |
Jusqu'à présent tous les effets d'aliasing que nous avons vu pouvaient être présentés avec un screenshot, c'est-à-dire de manière statique. Avec le pixel popping c'est plus complexe. Cet aliasing fait référence à deux problèmes le premier statique où on voit qu'il manque des parties graphiques comme le montre l'image ci-dessous, mais aussi en dynamique c'est-à-dire lorsqu'on est en mouvement dans une scène 3D. Il se passe alors un effet d'apparition et de disparition partiel de l'élément graphique concerné (grillage, ligne téléphonique,...).
L'augmentation de résolution est une aide pour le pixel popping, mais largement insuffisante. De même ce n'est pas spécifiquement l'augmentation du nombre d'échantillons qui corrige le problème, mais simplement l'ajout de dégradé sur les bordures des objets fins subissant le pixel popping qui résoud le problème. Cet ajout tend en fait à légèrement augmenter l'épaisseur moyenne de l'objet |

| | |
Le bump mapping consiste à donner l'illusion d'une déformation en hauteur des surfaces auquel est associé un éclairage diffu et généralement spéculaire. Il y a toujours un éclairage associé au bump mapping sinon on ne pourrait pas voir les variations de hauteur des surfaces. Bien qu'il existe, lors des opérations de calcul du bump mapping + lumière diffuse, des pertes d'informations, elles ne sont pas très notables. Par contre l'ajout de lumière spéculaire amplifie la visibilité de ce phénomène et un aliasing parfois prononcé apparaît. La lumière spéculaire est une lumière intense réfléchie par la surface et qui en pratique apparaît comme une petite zone très claire sur les tuyaux et les murs humides de jeux comme Far Cry, Doom3, Half-Life 2,...
L'une des solutions est évidemment le SSAA, l'augmentation de résolution n'ayant ici aucun effet notable. Mais comme il s'agit plus d'erreur de calcul, la meilleure solution consiste à intégrer à l'algorithme de calcul du bump mapping avec lumière spéculaire une correction. Nous verrons qu'une approche similaire est utilisée pour l'aliasing de shader. Dans le cas présent comme le montre le document de NVidia, on estime l'erreur moyenne qu'on réinjecte dans les données pour la corriger.
L'aliasing de bump mapping est devenu un problème sérieux avec la généralisation de l'utilisation de cette technique 3D. Le bump mapping le plus utilisé étant le bump mapping per pixel. |

| | |
Pour comprendre l'aliasing de shader, il faut savoir qu'on peut assimiler une image d'une scène 3D qui se construit à un signal qui se propage. Bon je ne vais pas entrer dans les détails, mais voici une image qui va vous éclairer. Mettons-nous au bord d'une plage et regardons les vagues. Sur les 25 premiers mètres les plus proches de nous il y a 2 ou 3 vagues. A une distance de 25 à 50 mètres, il y en a 3 ou 4, à une distance de 100 mètres il y en a une dizaine. En fait plus on regarde loin, plus il y a de vagues dans un intervalle donné. La fréquence d'apparition des vagues est d'autant plus importante qu'on regarde loin. Et plus on regarde loin, plus il faut avoir un oeil de lynx pour les distinguer. Si on assimile les vagues à un signal sinusoïdal, on dit que la fréquence du signal augmente en fonction de la distance du regard.
Ce qui se passe avec les pixels c'est que plus on regarde loin dans une scène 3D, plus pour une distance donnée il y a de pixels à définir. Le problème en 3D c'est que la quantité d'informations (la définition et le nombre de pixels) a ses limites et on les atteint rapidement. Dès qu'on a plus assez d'informations, on a un effet d'aliasing. On parle d'aliasing haute fréquence ou en anglais High frequency aliasing.
Il y a deux situations pour lesquelles l'aliasing de shader est particulièrement important ou du moins peut l'être : - - Textures procédurales ; une texture procédurale est une texture générée par une formule mathématique exploitée par le pixel shader. Elles sont donc apparues avec les pixels shader. Un jeu qui a montré ce qu'on pouvait faire avec de telles textures et qui a fait sensation à sa sortie était Serious Sam. Rappelez-vous les grandes étendues de désert ou de gazon. C'était des textures procédurales. Voici un exemple ou l'on voit la dégradation des motifs de la texture.
- - Les étendues d'eau (lac, mer, rivière) : Ce type de décors est particulièrement sensible à cela car, comme pour les textures procédurales, le regard peut porter loin et faire apparaître un aliasing. Mais dans ce cas l'eau est souvent animée et en plus par une fonction sinusoïdale qui amplifie le phénomène d'aliasing. Exemple dans je jeu Halo, d'un aliasing de shader sur la mer (sur Halo).
Comme solution on peut imaginer que le SSAA et l'augmentation de résolution sont une solution. Mais dans ce cas comme pour l'aliasing de bump mapping, les développeurs préfèrent prendre le problème à la source et intègrent dans leurs algorithmes une technique permettant de fortement limiter voire résoudre le problème d'aliasing. Cela se fait évidemment avec un petit surcoût en temps de calcul mais mieux vaut cela qu'un aliasing qui cache le paysage.
Il faut savoir que les pixels Shader 3.0 dans Directx 9.0c incluent une méthode d'anti-aliasing des shaders. C'est un des intérêts des pixels shader 3.0 qui est rarement noté.
Le problème est que tous les shader ne peuvent avoir un algorithme correcteur du moins acceptable pour le temps réel. Dans cette situation le SSAA apparaît comme la seule solution, mais c'est loin d'être la meilleure. Effectivement, le SSAA va filtrer les shader sans avoir connaissance des raisons de l'aliasing alors qu'un algorithme correcteur corrige exactement la raison du problème. De la même manière que le MSAA offre une qualité légèrement inférieure au SSAA, le SSAA offrira une qualité dans le choix des couleurs pour l'anti-aliasing inférieure à un algorithme correcteur. Toutefois il faut vraiment être pointilleux pour voir la différence et celle-ci ne se voit certainement pas durant une partie. On peut donc considérer dans la pratique que le SSAA est une bonne solution, mais il ne faut pas oublier qu'elle n'est pas parfaite. |



| | |
Comme vous avez pu le constater durant cet article, l'aliasing est un problème majeur en ce qui concerne la qualité d'affichage des scènes 3D. Mais tous les jeux ne montrent / subissent pas ce problème de la même manière. Ainsi les anciens jeux (thief 2 par exemple) ne montrent pas tant de problèmes avec l'aliasing. Il existe plusieurs raisons à cela. La première c'est que le nombre d'objets dans les jeux modernes a considérablement augmenté et donc la qualité d'aliasing qui peut être perçue est plus importante. La seconde c'est que des technologies comme les shader et le bump mapping ont fait apparaître de nouveaux aliasing. Un autre cas où les jeux peuvent apparaître plus sensibles à l'aliasing, c'est si le regard porte loin ou non dans un jeu. PAr exemple dans un jeu comme DOOM3 qui a lieu essentiellement dans des intérieurs de petite taille, l'aliasing est peu important si ce n'est à la limite sur le contour des objets, par contre sur un jeu comme Farcry ou Half-Life avec de grands extérieurs, toutes les formes d'aliasing apparaissent de manière plus importantes, ou du moins potentiellement.
Des techniques de correction d'algorithmes pour le bump mapping et les shader sont déjà mis en oeuvre, de même le MSAA qui peut être exploité de plus en plus couramment même avec des cartes de moyenne gamme (mais il reste encore du travail). Toutefois la solution idéale (en pratique) serait de pouvoir utiliser le SSAA. On y viendra un jour ou l'autre et il refait d'ailleurs son apparition avec les récentes cartes graphiques de NVidia 7800 pour solutionner le problème des textures alpha. Mais le SSAA ne pourra pas être généralisé avant plusieurs années à moins de concentrer tous les gains de puissance des évolutions des cartes graphiques à venir sur le SSA, ce que les développeurs n'apprécieraient pas et les joueurs non plus vu qu'il y a encore de nombreuses technologies et améliorations technologiques à intégrer aux jeux.
Dans l'immédiat il faut reconnaître que le MSAA + le SSAA pour les textures alpha, + des codes correcteurs pour certains bump mapping et shader + une résolution >=1280 x 960 résolvent bon nombre de problèmes sauf un seul l'aliasing de textures. Seul le SSAA permettant de le résoudre. Mais il ne faut pas non plus voir partout des textures aliasées. Effectivement s'il n'y a pas de motif géométrique cet aliasing est difficilement détectable (il suffit de penser à un mur crépi au motif irrégulier).
Avant de vous quitter voici quelques liens qui vous seront utiles pour aller plus loin. Toutefois j'attire votre attention sur le fait que certains de ces documents sont anciens et que les techniques de choix des échantillons par exemple ne correspondent pas, dans la réalité d'aujourd'hui, exactement à du OGSS pur ou du RGSS, mais plus à des évolutions mixant parfois les deux. Mais l'idée générale est conservée. |

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



 
|