Ich möchte versuchen, einem 3D-XNA-Spiel Schatten hinzuzufügen. Ich habe eine Testumgebung mit einer Leuchte und einer Kamera eingerichtet. Bei meiner Herangehensweise stoße ich jedoch auf Artefakte.
Ich verwende den Shader-Code von http://pastebin.com/zXi0hmsU , um das Endergebnis zu rendern, und http://pastebin.com/rY4Gcj9N , um die Schattenkarten zu erstellen. Der Code ist ziemlich einfach und beinhaltet die Erstellung der Tiefenkarte aus der Sicht des Lichts, die anschließende Projektion in den Kameraraum und die Überprüfung auf Okklusionen.
Aus den meisten Blickwinkeln erhalte ich jedoch ziemlich hässliche Ergebnisse
Die Szene besteht aus einigen einfachen Würfeln (von Hand konstruiert, nach außen gerichtet, die Rückseite ist ausgesondert), einem Licht (Schattenkarte in der oberen linken Ecke - sieht in Ordnung aus) und einer Kamera.
Mein RenderTarget für die Shadow Maps wird von initialisiert
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;
Anschließend wird der CreateShadowMap
Effekt angewendet, gefolgt vom LambertWithShadows-Effekt. Zuletzt wird die Schattenkarte mit a gezeichnet SpriteBatch
.
Der Rest des Codes besteht einfach darin, den Shadern die richtigen Werte bereitzustellen. Bei Bedarf kann ich es auch besorgen.