Salut à tous,

Après plusieurs recherches ici et là sur le net, j'implémente actuellement une méthode de Shadow Mapping pour une scène complexe à l'aide de shader GLSL.

Méthode classique de shadow mapping:

- Création de la shadow map en dessinant la scène depuis la lumière.
- Affichage de la scène depuis la caméra avec utilisation de la shadow map afin de déterminer les zones d'ombres.


Le souci est que cette méthode affiche le résultat de la scène et les ombres dans le même buffer. Ce que je souhaite c'est de récupérer seulement les pixels ombrés pour ensuite effectuer un traitement particulier sur ces pixels ombrés (par exemple les récupérer dans un buffer stencil ou FBO puis les traiter par un filtre flou ou gaussien)

Mon idée est donc :
- Récupération du z-buffer (dans une texture )de la scène vue depuis la lumière. Méhtode identique au cas classique.(shadowMap)
- Récupération du z-buffer de la scène vue depuis de la camera .(dephtMap)
- A l'aide d'un shader dessiner les ombres en utilisant les deux textures (en ayant au préalable sauvegardé les matrices de projection/modélisation nécessaire).

Dans la méthode classique on utilise la fonction GLSL pour déterminer la valeur de l'ombre du pixel correspondant.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
shadow2DProj(shadowMap, projCoord)
Mon souci est que je ne sais pas comment calculer la valeur de projCoord à partir de la texture de profondeur (dephtMap) et si cela est possible surtout, quelque chose qui ressemblerait à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
//fragment
uniform sampler2DShadow shadowMap;
uniform sampler2D DephtMap;
vec4 projCoord;
 
 
vec4 getProjCoordFromDephtMap() //calcul les coordonnées de projection à partir de depht Map
{
      float z = texture2D(dephtMap, gl_FragCoord.xy).r
      float x = ...
      float y = ...
      float z = ...
 
      vec4 realPosition = vec4( x, y ,z ,w);
 
      return gl_TextureMatrix[0] * realPosition;
}
 
void main ()
{
	const float kTransparency = 0.3;
	vec4 color = gl_Color;
 
        projCoord = getProjCoordFromDephtMap();
 
	float rValue = shadow2DProj(shadowMap, projCoord).r + kTransparency;
	rValue = clamp(rValue, 0.0, 1.0);
 
	gl_FragColor = color * rValue;
 
 
}
projCoord en fonction de dephtMap ? Possible ou pas possible ?.

Si quelqu'un a une idée, ou suggestion je suis preneur