Nvidia améliore la qualité graphique avec l'occlusion ambiante

Publié le 27/04/2009 par
Imprimer
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.
Vos réactions

Top articles