dimanche 19 février 2012

Profondeur de champ

La perception de la profondeur d’une scène 3D passe par plusieurs phénomènes, dont l’un des plus importants est sans doute la vision binoculaire : notre Å“il gauche ne voit pas exactement la même image que notre Å“il droit, puisqu’il est légèrement décalé. Le cerveau interprète les différences entre les deux images comme une différence de distance de l’observateur par rapport aux objets observés, ce qui crée l’impression de profondeur ou de relief.

C’est ce phénomène stéréoscopique qui est principalement mis en Å“uvre dans le cadre du cinéma ou de la télévision en 3D tels que nous les connaissons aujourd’hui. Grâce à ses module d’affichage, Tao Presentations permet de tirer pleinement parti de tels systèmes.

D’autres caractéristiques de l’image participent à l’effet de profondeur :
  • La projection de la scène 3D en deux dimensions introduit un effet de perspective, qui fait converger les lignes parallèles à l’infini. Cette convergence est un indice fort permettant à l’Å“il d’estimer la distance, et donc la profondeur 3D.
  • De cette perspective découlent d’autres indices visuels plus ou moins forts : impression de profondeur due aux objets en mouvement, taille relative de deux objets identiques mais positionnés à une distance différente de l’observateur, disparition des détails dans le lointain...
Mais l’effet qui m’intéresse ici, et qui participe également à la création d’un volume 3D, est le flou de mise au point (ou d'accommodation). Lorsqu’on observe un objet, l’Å“il fait la mise au point sur cet objet de manière à ce qu’il soit net. En contrepartie, les objets qui sont beaucoup plus éloignés, ou au contraire beaucoup plus proche de nous que l’objet observé apparaissent flous. Cette “profondeur de champ” limitée de l’Å“il est également fréquemment mise en avant en photographie, pour produire des clichés plus expressifs.

Il y a quelques jours, je suis tombé sur un article (en anglais) qui propose une technique pour simuler cette profondeur de champ en OpenGL. En quelques mots, on génère deux textures :
  • La première représentent l’image 2D de la scène 3D,
  • La deuxième est la carte de profondeur (depth map en anglais) qui correspond à cette image. Cette carte est une représentation, en niveaux de gris, de la distance qui sépare l’Å“il de l’observateur du point observé.
Ensuite on utilise un fragment shader GLSL qui va appliquer sur la première texture (image) un flou plus ou moins important selon la distance donnée par la seconde texture (depth map).

La commande frame_texture_with_depth de Tao Presentations permet d’obtenir facilement les deux textures requises. Voici un exemple qui représente deux boules de billard, la bleue se trouvant plus éloignée de l’observateur que la jaune :


Les textures d’image et de profondeur sont les suivantes :


Les tons de gris affichés dans la moitié droite de l’image représentent fidèlement la profondeur de la scène. Ainsi, un point blanc signifie qu’il n’y a aucun objet visible (c’est la couleur de fond qui est affichée sur l’image de gauche, ici le blanc). Au contraire, un point sombre correspond à un objet très proche de l’observateur. La boule jaune étant plus proche que la bleue, elle apparaît en gris plus foncé sur la depth map.

À partir de ces textures, il est possible d’intégrer une version simplifiée du shader écrit par martinsh pour obtenir l'effet de flou désiré. J’ai choisi de le faire sous la forme d’un module Tao afin de faciliter l’utilisation de l’effet. Ce module s’appelle sans surprise “Profondeur de champ” (Depth of field en anglais). Vous pouvez le télécharger et le tester dès maintenant (il est compatible avec Tao Presentations 1.03) ou bien attendre la prochaine version de Tao pour l’obtenir. Le module définit une fonction dof_frame_texture qui s'utilise comme frame_texture tout en permettant de bénéficier de l'effet de profondeur de champ. La mise au point s'ajuste grâce à quelques variables.

Voici le résultat lorsqu’on fait la mise au point sur la boule jaune :


Vous pouvez consulter la documentation technique du module sur notre site. Elle contient le code source du document Tao Presentations utilisé pour illustrer cet article.

Références : Depth perception (wikipedia), DoF with bokeh GLSL shader v2.4 (Martins Upitis).

Aucun commentaire:

Enregistrer un commentaire