Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs 3D
Moteurs 3D Forum d'entraide sur les moteurs 3D (conception d'un moteur, Ogre, Irrlicht...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/10/2012, 12h02   #1
zenux
Membre régulier
 
Inscription : février 2006
Messages : 336
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 336
Points : 79
Points : 79
Par défaut Shadow mapping: ombre qui bouge

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:
Code :
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);
Dans mon shader, je lis ma shadow map avec ces coordonnées:
Code :
1
2
vec4 shadowCoord = ((mLightProjectionView * position) / 2.0) + 0.5;
shadowCoord = shadowCoord * mShadowOffset;
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.)
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.
zenux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 10h59   #2
lightbulb
Membre régulier
 
Avatar de lightbulb
 
Homme
Inscription : septembre 2008
Messages : 108
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : septembre 2008
Messages : 108
Points : 73
Points : 73
C'est un problème récurrent en ce qui concerne les shadow maps, tu as plusieurs types de problèmes comme les shadow acne, le peter panning et dans ton cas le shadow aliasing.

Ton problème est du à une différence de taille de texel lorsque tu fais la projection de la light view à la camera view.

Pour régler le problème de nombreux algos on étés inventés comme le PCF (percentage closer filtering) qui font un echantillonage des texel proches et en font la moyenne pour smoother les edges.

Augmenter la résolution de la shadow map contribue également à régler le problème mais il y a diminution des performances, ensuite c'est à toi de voir !
lightbulb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 22h56   #3
Emmanuel Deloget
Expert Confirmé Sénior
 
Homme Emmanuel Deloget
Développeur informatique
Inscription : septembre 2007
Messages : 1 826
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Deloget
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2007
Messages : 1 826
Points : 4 381
Points : 4 381
Citation:
Envoyé par lightbulb Voir le message
C'est un problème récurrent en ce qui concerne les shadow maps, tu as plusieurs types de problèmes comme les shadow acne, le peter panning et dans ton cas le shadow aliasing.

Ton problème est du à une différence de taille de texel lorsque tu fais la projection de la light view à la camera view.

Pour régler le problème de nombreux algos on étés inventés comme le PCF (percentage closer filtering) qui font un echantillonage des texel proches et en font la moyenne pour smoother les edges.

Augmenter la résolution de la shadow map contribue également à régler le problème mais il y a diminution des performances, ensuite c'est à toi de voir !
Et après, il y a d'autres algorithmes basés sur les shadow map qui ont pour but de réduire les artefacts - perspective shadow map, adaptive shadow maps, ... La litterature est très importante sur le sujet, je te conseille donc de t'y reporter.
__________________
[FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.
Emmanuel Deloget est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h42.


 
 
 
 
Partenaires

Hébergement Web