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...
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é.
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 :
À 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 :
Références : Depth perception (wikipedia), DoF with bokeh GLSL shader v2.4 (Martins Upitis).