ENSIMAG 3A - Synthèse d'images et animation
TP3 : Shaders avancés


Détection des silhouettes

Nous allons réalisez la détection des silhouettes des objets par un traitement de l'image calculé par OpenGL puis composité le résultat obtenu avec le rendu toon du TP1. Le principe est d'utiliser un filtre détecteur de contour comme Sobel :


H =
-1 -2 -1
 0  0  0
 1  2  1

   V =
1  0 -1
2  0 -2
1  0 -1

   résultat = sqrt(H² + V²)

Un tel filtre va détecter la différence d'intensité entre deux pixels consécutifs. Plus la différence entre la valeur du pixel considéré et les valeurs des pixels l'entourant est grande, plus le contour sera marqué. Dans notre cas, pour détecter les silhouettes, ce ne sont pas les variations de couleur qui nous intéressent, mais celles de profondeur. Ainsi, il faut appliquer le filtre sur le depth buffer pour que les changements de profondeur soient marqués par un contour.

Cependant, la convolution d'une image (de couleur ou de profondeur) avec un filtre nécessite d’accéder à plusieurs pixels de l’image, ce qui est impossible en une seule passe de rendu. Nous allons donc utiliser la technique du "deferred shading" pour dessiner dans des textures le rendu toon et la carte de profondeur, avant d'appliquer une seconde passe sur les images 2D obtenues pour en extraire les silhouettes et les compositer avec le toon shading. Il faut pour cela utiliser un FrameBufferObject (FBO) et l'attribut gl_FragCoord du fragment shader pour connaitre la position du fragment courant dans l'image

toonSilhouettes

Environment mapping

L'environment mapping (carte d'environnement) est un procédé qui permet de générer les réflexions d'un environnement sur un objet en temps réel en utilisant des textures. L'environement map peut être vu comme une sphère ou une boîte englobant toute la scène. Il existe plusieurs façons de représenter un environnement : textures sphériques, textures paraboidales, textures cubiques... Cette dernière représentation est la plus simple à utiliser avec OpenGL.

Dans le vertex shader, utilisez la fonction textureCube pour récupérer la couleur de l'environnement dans la direction de réflexion du vecteur de vue.