Bonjour,
Je suis en train d'implémenter l'ombrage par shadow mapping en GLSL. Dans une première passe, j'obtiens correctement le zbuffer à partir du point de vue de la source lumineuse. Le zbuffer est attaché à un FBO en tant que texture, et est calculé par OpenGL (les fonctions fixes du pipeline).
Lors du rendu de la scéne à partir de la caméra, la position des vertices dans le repère-fenêtre de la source lumineuse (positionLightSpace) est calculée dans le vertex shader, comme suit:
(lightMatrix * modelMatrix) est équivalent à gl_ModelViewMatrix de la première passe. Le viewport est passé en uniform vec4 (x,y,width, heigth).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // in clip plane positionLightSpace = gl_ProjectionMatrix * lightMatrix * modelMatrix * gl_Vertex; // perspective division positionLightSpace.xyz /= positionLightSpace.w; // wiewport transform positionLightSpace.x = (positionLightSpace.x +1.0)*( viewport.z/2.0) + viewport.x; positionLightSpace.y = (positionLightSpace.y +1.0)*( viewport.w/2.0) + viewport.y;
Cette position est interpolée est transférée dans le fragment shader, pour pouvoir y faire la comparaison avec le zbuffer-lumière. Les valeurs x et y sont corrects, mais pas celle z. Ce qui donne des ombres incorrectes.
J'ai l'impression que la valeur z est calculée autrement par les fonctions fixes d'OpenGL, mais je ne sais pas en quoi. Quelque chose m'échappe...
Avez-vous des idées?
Partager