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

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

Top articles