HardWare.fr


Nvidia améliore la qualité graphique avec l'occlusion ambiante
Cartes Graphiques
Publié le Lundi 27 Avril 2009 par Damien Triolet

URL: /articles/756-1/nvidia-ameliore-qualite-graphique-avec-occlusion-ambiante.html


Page 1 - Introduction



Avec les pilotes GeForce en version 185, Nvidia a introduit une nouvelle option graphique : l'occlusion ambiante. Celle-ci permet de générer les ombres induites par la lumière indirecte dans les scènes 3D, de quoi améliorer sensiblement le rendu simplement en activant une option dans le panneau de contrôle des pilotes.

L'occlusion ambiante c'est quoi ?
Dans une scène 3D, l'éclairage de chaque élément est constitué de plusieurs composantes. Les premières sont les plus connues et les plus évidentes puisque ce sont celles auxquelles nous pensons en premier : les sources de lumière directes. Les secondes sont souvent oubliées mais pourtant très importantes. Ainsi dans la réalité, chaque objet réfléchit une partie de la lumière qu'il reçoit. Autrement dit chaque objet de la scène devient pour chaque autre objet une source de lumière indirecte qui peut participer à son éclairage.


Un rendu de type illumination globale permet de représenter toutes ces sources de lumières indirectes, mais il est très lourd et coûteux en termes de performances. En 3D temps réel, ces sources de lumières indirectes sont en général représentées d'une manière très simplifiée par une constante, la lumière ambiante. Il s'agit en quelque sorte de placer un éclairage de base auquel vient s'ajouter les autres sources de lumières. Si cette approximation permet de facilement éviter que la scène ne soit trop sombre, elle correspond à une simplification grossière de la réalité ce qui nuit au réalisme.

La solution pour compenser ce défaut sans avoir recours à l'illumination globale se nomme occlusion ambiante et consiste à se faire une idée de la quantité de lumière ambiante qui arrive en chaque point, ou plutôt de celle qui n'y arrive pas. Comme le nom de la technique l'indique, il s'agit de déterminer pour chaque point quelle est l'occlusion de la lumière indirecte et, d'après cela, réduire la valeur de la lumière ambiante qui lui est appliquée. Grossièrement il s'agit donc de rendre sur toute la scène l'ombre douce créée par les obstacles à la lumière indirecte, ce qui va lui ajouter de la profondeur.


A gauche un rendu classique, à droite avec l'occlusion ambiante.



Page 2 - L'implémentation de Nvidia

L'implémentation de Nvidia
Différentes techniques existent pour intégrer l'occlusion ambiante au rendu, plus ou moins gourmandes et plus ou moins simples à mettre en place. Etant donné que le but de Nvidia est d'appliquer cet effet dans des jeux existants et à un niveau de performances suffisant, le fabricant s'est tourné vers une méthode adaptée : la screen space ambiant occlusion ou SSAO, que nous allons décrire ici en détail.

Pour rappel, le rendu 3D se réfère à différents espaces :

World space : le monde 3D dans lequel la scène est construite
Eye space : le monde 3D vu par la caméra
Screen space : l'image 2D qui est une projection de la scène 3D vue par la caméra

La SSAO consiste, comme son nom l'indique, à calculer l'occlusion ambiante sur base de l'image dans laquelle, au préalable, a été rendue la scène. En d'autres termes c'est un effet qui peut être assimilé au type post processing qui va permettre d'améliorer l'image finale affichée à l'écran.

Pour cela, Nvidia a besoin de 2 choses : le Z-buffer et les normales à chaque point représenté par un pixel à l'écran. Le Z-buffer permet de connaître la profondeur, soit la distance de chaque point par rapport à la caméra. Il représente donc l'eye space. Les normales permettent de connaître l'orientation de chacun de ces points.


Sur base de ces 2 informations, il est possible de se représenter une vision, certes limitée, da la scène 3D et des objets qui peuvent être une obstruction à la lumière ambiante. La normale est nécessaire pour connaître l'orientation de chaque point et donc des sources de lumière ambiante qui peuvent l'affecter.

Obtenir le Z-buffer est simple. C'est un petit peu plus compliqué pour les normales. Si la scène 3D représentait simplement un paysage continu par exemple il serait possible d'estimer les normales sur base du Z-buffer, en observant la valeur des points adjacents. La méthode serait cependant peu précise et n'est pas possible en pratique puisque les scènes 3D sont représentées par différentes surfaces discontinues, ce qui veut dire que 2 points adjacents peuvent ne pas provenir de la même surface et qu'il est impossible de le savoir à ce niveau.

Il faut donc calculer toutes les normales au préalable, dans une passe de rendu de la géométrie. Il s'agit bien ici de les calculer pour chaque point et pas simplement de récupérer les valeurs interpolées qui fausseraient les résultats. Tout ceci peut se faire soit dans une passe supplémentaire, dédiée à cette opération (ce qui permet également de le faire facilement dans une résolution inférieure pour réduire le coût), soit dans une passe de rendu initiée par le moteur graphique.


Page 3 - L'algorithme de SSAO

L'algorithme de SSAO

Une fois les 2 données à disposition, il ne reste plus qu'à observer l'occlusion à la lumière ambiante autour de chaque point. Il n'est bien entendu pas possible de passer en revue toute la scène pour chaque point. Une simplification est donc nécessaire. L'algorithme va s'attarder sur un voisinage du point de manière à ne prendre en compte que les surfaces les plus proches et donc les plus susceptibles d'avoir une influence.

La première étape consiste donc à déterminer ce voisinage. Il s'agit d'un hémisphère dont la base est sur le plan tangent au point étudié et centrée sur celui-ci. Tout objet présent dans cet espace va représenter une occlusion ambiante. Cet hémisphère prend forme dans l'eye space et est ensuite projeté dans le plan de l'image dans lequel il représente un cercle plus ou moins grand suivant la profondeur du point étudié.


Reste que ce cercle englobe encore beaucoup de points et qu'il n'est pas possible de tous les analyser pour déterminer s'ils représentent ou non une occlusion à la lumière ambiante. Qui plus est, étant donné que le cercle est d'une taille variable une fois projeté dans le plan de l'image, le coût du traitement serait impossible à déterminer puisque dépendant de la profondeur moyenne de la scène. Une simplification très importante intervient donc ici : seuls un certain nombre de points ou samples dans un certain nombre de directions seront étudiés. Par exemple 4 samples sur 4 directions différentes.


C'est une approximation grossière puisque ce nombre limité de samples va passer à côté de beaucoup d'informations. Pour compenser cela, Nvidia introduit une dose d'aléatoire au niveau du choix des directions et des samples observés sur celles-ci. Ce côté aléatoire est cependant bien contrôlé de manière à couvrir l'espace au mieux.

L'occlusion est la moyenne des occlusions constatées dans chaque direction. Pour calculer celles-ci, il faut additionner les contributions à l'occlusion des différentes samples, qui sont déterminées avec un petit peu de trigonométrie et pondérée suivant leur distance par rapport au point étudié.



Notez que pour éviter que la manque de tesselation de la géométrie ne crée une fausse occlusion et ne rende encore plus visible ce manque, l'algorithme ne prend pas en compte les petites occlusions.

Reste une dernière étape : le filtrage de toutes ces données. Il est rendu nécessaire par le côté aléatoire du choix des samples qui introduit beaucoup de bruit. Réaliser ce filtrage proprement est très délicat ce qui le rend gourmand en ressources. Il s'agit d'un filtre gaussien complexe, dépendant de la profondeur pour éviter de faire déborder l'ombre des arrêtes. Nvidia se contente cependant de filtrer dans une direction puis dans l'autre, ce qui en principe n'est pas permis pour ce genre de filtre, mais permet de gagner en performances.

Ce filtrage est également l'occasion de redimensionner le tout dans la bonne résolution si l'occlusion ambiante a été calculée dans une résolution inférieure. Notez ici que l'absence de gather4 dans les GeForce, fonction de DirectX 10.1 et supportée depuis longtemps par les Radeon, limite le rapport qualité/coût de ce filtre.


Au final nous obtenons une approximation de l'ombre causée par la lumière ambiante sur l'ensemble de la scène. Il suffit de la mélanger au rendu de la scène, avant l'application sur celle-ci des zones transparentes et des autres effets de post processing, pour ajouter une nouvelle dimension à l'image.

Si le sujet vous intéresse, vous pourrez retrouver quelques détails supplémentaires dans ce document  de Nvidia.


Page 4 - Niveaux de qualité en image

Niveaux de qualité en image
Voici représentés différents niveaux de qualité de l'algorithme de SSAO utilisé par Nvidia :






Comme vous pouvez le constater, le gain de performances obtenu en calculant l'occlusion ambiante dans une résolution réduite de moitié est énorme, pour une baisse de qualité réduite. Il s'agit donc d'un bon compromis.


Page 5 - Les limitations, les pilotes

Les limitations
Cette implémentation de l'occlusion ambiante repose sur de nombreuses approximations, ce qui introduit quelques limitations au niveau de sa fidélité.

De par sa nature, la SSAO n'a connaissance que des éléments visibles à l'écran. Imaginez par exemple un tuyau contre un mur et une caisse devant cet ensemble. La caisse est trop loin du mur pour causer une occlusion à la lumière ambiante, par contre le tuyau va, lui, entrainer l'apparition d'une ombre sur le mur. Cependant l'algorithme de SSAO n'a aucun moyen de savoir que le tuyau continue derrière la caisse. Ce qui n'est pas bien grave sauf dans le cas où le tuyau est tout juste derrière la caisse, c'est-à-dire qu'il n'est pas visible mais que son ombre devrait l'être. Du coup si vous vous déplacez dans la scène, l'ombre va apparaître soudainement ou disparaître suivant que le tuyau devient visible ou disparaît.

Un autre cas courant d'occlusion ambiante est le coin d'une pièce. Ceux-ci sont toujours légèrement ombragés, parce qu'ils reçoivent moins de lumière indirecte. C'est d'ailleurs souvent un élément mal représenté dans les jeux et qui fait que l'éclairage nous semble « bizarre » par rapport à la réalité. L'algorithme de SSAO permet de représenter cette ombre, mais seulement si les 2 surfaces qui forment le coin sont visibles à l'écran. Dès que l'une des surfaces sort du champ de vision, l'ombre qu'elle entraîne disparait aussitôt.

Enfin, l'occlusion ambiante ainsi calculée est dépendante de l'angle de vision ce qui veut dire que si vous tournez sur vous-même vous pourrez remarquer que les ombres sont influencées. Un effet accentué par le bruit qui, malgré le filtrage, reste visible en mouvement.


Les pilotes
Nvidia propose dans ses pilotes 185 une option qui permet d'activer l'occlusion ambiante pour les GeForce 8 et supérieures. Celle-ci n'est cependant fonctionnelle que dans certains jeux. La liste actuelle est composée de 22 jeux et devrait s'allonger progressivement :

Assassin's Creed
BioShock
Call of Duty 4
Call of Duty 5
Call Of Juarez
Company Of Heroes
Counter-Strike Source
Dead Space
Devil May Cry 4
F.E.A.R. 2
Fallout 3
Farcry 2
Half Life 2 series
Left 4 Dead
Lost Planet: Colonies
Lost Planet: Extreme Condition
Mirror's Edge
Portal
Team Fortress 2
Unreal Tournament 3
World In Conflict
World of Warcraft

Si l'option n'est pas fonctionnelle d'une manière générale, c'est pour une bonne raison et qui est identique pour l'activation de l'antialiasing via les pilotes. Les moteurs graphiques sont maintenant devenus plus complexes et ne font pas simplement un rendu dans le framebuffer. Du coup il n'est plus possible d'appliquer ce genre d'effet simplement sur celui-ci. Il faut spécifier son application sur le bon buffer, ce qui est fait manuellement, titre par titre.

Certains types de rendus plus exotiques peuvent également poser un certain nombre de problèmes et ont donc besoin d'une adaptation de l'algorithme. Enfin, certains jeux tels que Crysis et H.A.W.X. gèrent déjà nativement cet effet.

D'après ce que nous avons pu voir à l'écran, nous supposons que Nvidia a opté pour un calcul de l'occlusion ambiante dans une résolution réduite de moitié, pour alléger l'opération. Nous ne pouvons cependant pas savoir combien de direction et de samples sont utilisés, ni la dimension de la zone d'influence. Nvidia peut qui plus est paramétrer cela différemment d'un jeu à l'autre.

Pour observer l'intérêt pratique de cette technique de rendu, nous avons testé la version 185.63 des pilotes avec quelques-uns de ces jeux, une GeForce GTX 275 et une GeForce GTX 295. Nous avons également essayé la version 185.66 des pilotes mais celle-ci présentait de nombreux bugs une fois l'option activée.


Page 6 - Bioshock

Bioshock

Maintenez la souris sur l'image pour observer l'effet de l'occlusion ambiante.

Images pleine résolution :
Sans AO
Avec AO


Sous Bioshock, la qualité progresse sensiblement, l'atmosphère sombre profitant pleinement de l'occlusion ambiante. L'impact des performances est énorme mais nous restons malgré tout à un niveau de performances suffisant, même sur la GeForce GTX 275. Notez que lorsque l'antialiasing est activé, via les pilotes, l'occlusion ambiante ne fonctionne plus.


Page 7 - Company of Heroes

Company of Heroes

Maintenez la souris sur l'image pour observer l'effet de l'occlusion ambiante.

Images pleine résolution :
Sans AO
Avec AO


Le gain apporté par l'occlusion ambiante est ici aussi évident, le jeu passe à un niveau de qualité supérieur. L'impact sur les performances est par contre ici plutôt réduit.


Page 8 - Far Cry 2

Far Cry 2

Maintenez la souris sur l'image pour observer l'effet de l'occlusion ambiante.

Images pleine résolution :
Sans AO
Avec AO


L'intérêt est ici moins évident puisque les performances chutent presque de moitié alors que le gain en qualité est très réduit.


Page 9 - Half Life 2 Episode 2

Half Life 2 Episode 2

Maintenez la souris sur l'image pour observer l'effet de l'occlusion ambiante.

Images pleine résolution :
Sans AO
Avec AO


L'éclairage d'Half Life 2 et de ses dérivés, qui a pris un petit coup de vieux par rapport à ce qui se fait de mieux aujourd'hui, profite de l'occlusion ambiante pour se donner une nouvelle jeunesse. Les performances chutent fortement mais restent à un niveau élevé compte tenu de la légèreté du rendu pour les cartes graphique haut de gamme récentes.


Page 10 - World in Conflict

World in Conflict

Maintenez la souris sur l'image pour observer l'effet de l'occlusion ambiante.

Images pleine résolution :
Sans AO
Avec AO


L'occlusion ambiante améliore ici légèrement le rendu de la végétation et des bâtiments. Le coût en performances reste contenu.


Page 11 - Conclusion

Conclusion
Le support de l'occlusion ambiante par Nvidia est l'exemple type des nouveautés que nous apprécions particulièrement retrouver dans les pilotes des cartes graphiques. Simplement via le panneau de contrôle, elle permet d'améliorer sensiblement la qualité de certains jeux qui gagnent en homogénéité et en profondeur.

Certes, le gain qualitatif n'est pas aussi important dans tous les jeux. Certes la technique est très gourmande bien que fortement simplifiée. Mais elle a le mérite d'exister et surtout de très bien fonctionner dans certains cas. Elle permet de profiter de la puissance de calcul des GeForce récentes, plutôt haut de gamme, pour donner une seconde jeunesse aux jeux plus anciens ou faire rentrer dans 2009 ces jeux dont les développeurs se sont trompés d'époque.


Depuis l'introduction par ATI des Smartshaders, qui permettaient d'appliquer un effet de post processing sur l'image, il nous a paru évident, outre le côté gadget de ce que proposait ATI à l'époque, qu'il y avait là un potentiel énorme pour les fabricants de GPUs de se démarquer sur le plan de la qualité graphique.

Nous avons donc régulièrement argumenté à ce sujet avec Nvidia dont la réponse s'est toujours limitée à « ce n'est pas à nous d'améliorer le rendu des jeux choisi par les développeurs ». Inutile d'insister en disant que c'est déjà ce qu'ils font avec l'antialiasing, sous peine de se retrouver face au mur de la communication de Nvidia bien décidé à nous faire accepter que ce que la société ne fait pas ne doit pas être fait.

Avec l'ajout de l'occlusion ambiante, Nvidia se contredit donc d'une fort belle manière. Nous ne pouvons qu'espérer que le père des GeForce ne va pas en rester là, va allonger la liste des jeux supportés et pourquoi pas réfléchir à d'autres améliorations graphiques de ce type.


Copyright © 1997-2026 HardWare.fr. Tous droits réservés.