Artefakte der Schattenkarte

16

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 Ergebnissewie in diesem Screenshot

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 CreateShadowMapEffekt 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.

Etan
quelle

Antworten:

19

Dies ist ein typisches Problem namens Shadow Map Akne . Dies liegt daran, dass das projizierte Pixel der Schattenkarte (Tiefe) größer als das Pixel auf dem Bildschirm ist (Gleichung kann die Tiefe nicht korrekt darstellen).

Bildbeschreibung hier eingeben

Hierfür gibt es viele Lösungen. Am einfachsten ist Bias (ich sehe es in Ihrem Code, das ist also nicht das Problem). Und die zweite einfache Lösung ist die Schattenkarte in größerer Auflösung. Es ist wirklich mehr als typisch, Schattenkarten in einer Auflösung von 2048 x 2048 in der aktuellen hw zu haben. (BEARBEITEN: das ist nicht wahr, ich habe das geschrieben, als ich am Rendern von Filmen arbeitete. In der Spieleentwicklung möchten Sie Ihre Schattenkarte so klein wie möglich halten.)

Einige Ressourcen zum Erlernen fortgeschrittener Techniken.


bearbeiten:

Notabene
quelle
Ich habe einige weitere Materialien zu diesem Thema in Arbeit, wenn Sie interessiert sind, werde ich es auch teilen.
Notabene
Das Hauptproblem bei großen Auflösungen ist, dass ich im Endspiel ungefähr 3-4 Lichter habe, die ungerichtet sind => Ich muss dort kubische Schattenkarten verwenden, was 24 Schattenkarten ergibt. Wenn Sie zusätzliches Material haben, würde ich Ihre Bemühungen, es mit mir zu teilen, wirklich begrüßen :-)
Etan
Ich bin zumindest interessiert, wenn das zählt :)
James
1
@Etan. Ja, omnidirektionale Lichter sind wirklich schmerzhaft, wenn es um Schatten geht. (Ich weiß etwas darüber :) gamedev.stackexchange.com/questions/6203/… ). Versuchen Sie, Dual-Paraboloid-Karten zu verwenden. Oder wenn Sie Cubemaps mögen, versuchen Sie, Platz zu sparen, indem Sie die Schnittmenge frustum-camera_frustum für jedes Gesicht / Rendering auslesen. Sie werden wahrscheinlich nicht immer Schatten für alle Richtungen benötigen (besonders im Außenbereich)
Notabene
1
@Etan @James Ich habe noch ein paar Sachen für dich hinzugefügt. Beides ist lesenswert, wenn Sie sich für dieses Thema interessieren.
Notabene