Artefacts de carte d'ombre

16

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 laidscomme dans cette capture d'écran

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' CreateShadowMapeffet 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.

Etan
la source

Réponses:

19

C'est un problème typique appelé acné de l'ombre . Cela est dû au fait que le pixel projeté de la carte d'ombre (profondeur) est plus grand que le pixel à l'écran (par exemple, ne peut pas représenter correctement la profondeur).

entrez la description de l'image ici

Il existe de nombreuses solutions à cela. Le plus simple est le biais (je le vois dans votre code, donc ce n'est pas le problème). Et la deuxième solution facile est une carte d'ombre en plus grande résolution, il est vraiment plus que typique d'avoir des shadowmaps en résolution 2048x2048 sur le matériel actuel. (EDIT: ce n'est pas vrai, j'ai écrit que lorsque je travaillais sur le rendu de film. Dans le développement de jeux, vous voulez garder votre carte d'ombre aussi petite que possible)

Quelques ressources pour étudier des techniques plus avancées.


Éditer:

Notabene
la source
J'ai plus de matériel sur ce sujet en cours de travail, si vous êtes intéressé je le partagerai aussi.
Notabene
Le principal problème avec les grandes résolutions est qu'en fin de partie, j'ai environ 3-4 lumières non orientées => je vais devoir utiliser des ombres cubiques, ce qui donne 24 shadowmaps. Si vous avez du matériel supplémentaire, j'apprécierais vraiment votre effort de le partager avec moi :-)
Etan
Je suis au moins intéressé si cela compte :)
James
1
@Etan. Ouais, les lumières omnidirectionnelles sont vraiment douloureuses si on parle d'ombres. ( j'en sais quelque chose :) gamedev.stackexchange.com/questions/6203/… ). Essayez d'utiliser des cartes paraboloïdes doubles. Ou si vous aimez les cubemaps, essayez d'économiser de l'espace en éliminant l'intersection frustum-camera_frustum pour chaque face / rendu. Vous n'aurez sans doute pas besoin d'ombre pour toutes les directions tout le temps (en particulier à l'extérieur)
Notabene
1
@Etan @James J'ai ajouté d'autres trucs pour vous. Les deux méritent d'être lus si vous êtes intéressé par ce sujet.
Notabene