Je veux essayer d'ajouter des ombres à un jeu 3D XNA. J'ai mis en place un environnement de test avec une lumière et une caméra. Cependant, je rencontre des artefacts avec mon approche.
J'utilise le code shader de http://pastebin.com/zXi0hmsU pour rendre le résultat final et http://pastebin.com/rY4Gcj9N pour créer les shadow maps. Le code est assez simple et implique la production de la carte de profondeur du point de vue de la lumière, puis la projeter dans l'espace de la caméra et vérifier les occlusions.
Cependant, sous la plupart des angles, j'obtiens des résultats assez laids
La scène se compose de quelques cubes simples (construits à la main, tournés vers l'extérieur, la face arrière est abattue), une lumière (la carte des ombres montrée dans le coin supérieur gauche - ça va) et une caméra.
Mon RenderTarget pour les shadow maps est initialisé par
int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
Ensuite, l' CreateShadowMap
effet est appliqué, suivi de l'effet LambertWithShadows. Enfin, la carte d'ombre est dessinée à l'aide de a SpriteBatch
.
Le reste du code consiste simplement à fournir les valeurs correctes aux shaders. Si nécessaire, je peux bien le fournir.