[GLSL] Calculer le z-buffer
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:
Code:
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; |
(lightMatrix * modelMatrix) est équivalent à gl_ModelViewMatrix de la première passe. Le viewport est passé en uniform vec4 (x,y,width, heigth).
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 :calim2:...
Avez-vous des idées?