Bonjour,
J'ai développé les shadow maps dans mon petit moteur 3D en OpenGL.
Tout se passe bien sauf que les bords de mes ombres bougent légèrements quand ma caméra bouge.
Voici une image trouvé sur Internet qui représente bien le problème: http://i.msdn.microsoft.com/dynimg/IC340455.jpg
J'ai lu plusieurs fois sur Internet que la solution à ce problème était de créer une matrice de translation afin de lire le bon pixel (valeur entière) sur la shadow map.
J'ai donc implémenté ceci:
Dans mon shader, je lis ma shadow map avec ces coordonnées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Point4<float> anyPointOnShadowMap = getLightProjectionMatrix() * getLightViewMatrix() * Point4<float>(0.0, 0.0, -0.2, 1.0)) / 2.0f) + 0.5f; float texCoordX = (shadowMapSize * anyPointOnShadowMap.X); float texCoordY = (shadowMapSize * anyPointOnShadowMap.Y); float roundedTexCoordX = round(texCoordX); float roundedTexCoordY = round(texCoordY); float dx = roundedTexCoordX - texCoordX; float dy = roundedTexCoordY - texCoordY; dx /= (float)shadowMapSize; dy /= (float)shadowMapSize; Matrix4<float> mShadowOffset; mShadowOffset.buildTranslation(dx, dy, 0.0);
Problème: ça ne fonctionne pas. Mes ombre s'affiche toujours presque comme avant (petit différence du à la matrice mShadowOffset mais ça ne règle pas du tout le problème.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 vec4 shadowCoord = ((mLightProjectionView * position) / 2.0) + 0.5; shadowCoord = shadowCoord * mShadowOffset;
Une idée ? Peut-on utiliser n'importe quel point de départ comme je le fais (0.0, 0.0, -0.2, 1.0) ?
Merci d'avance.
Partager