Unschärfepunkt-Lichtvarianz-Schattenkarte

7

Ich habe an der Implementierung von Varianzschatten-Mapping für mein Spiel gearbeitet. Ich konnte ein Punktlicht mit Varianz-Schatten-Mapping arbeiten lassen, wobei eine Gaußsche Unschärfe auf die Schattenkarte angewendet wurde, um das Aliasing zu reduzieren. Jetzt versuche ich, Punktlichter zu implementieren, bin mir aber nicht sicher, wie ich die Gaußsche Unschärfe anpassen soll, um mit der Schattenkarte zu arbeiten, wenn sie in einer Würfelkarte gespeichert ist. Ich habe eine Weile gesucht, aber ich kann anscheinend keine Beispiele finden, die Punktlichter verwenden. Kann mir hier jemand helfen?

Telanor
quelle
Ich würde gerne ein Beispiel Ihrer Arbeit sehen - vielleicht sogar Quellcode.
Asche999

Antworten:

2

Es gibt ein Beispiel für die Varianzschattenzuordnung mit Punktlichtern, jedoch wird anstelle der Würfelzuordnung die doppelte Paraboloidzuordnung verwendet. Das Tutorial mit dem Beispiel wird hier gezeigt .

Wenn Sie bereit sind, mit etwas weniger Details als Cube-Maps umzugehen, ist die DP-Varianz-Schatten-Mapping einfacher zu codieren und erfordert zwei Texturen anstelle von sechs, wodurch Sie Speicherplatz sparen. Sie haben auch nur eine Naht zu verbergen.

Punktlichter sind normalerweise die schwierigste Art von Licht, um Schattenzuordnungen anzuwenden (und mehr Speicher zu verbrauchen), weshalb viele Spiele sie nicht so oft verwenden.

ChrisC
quelle
Ich habe dieses Tutorial gesehen, aber ich habe versucht, diese Methode zu vermeiden, da ich mich mehr für Methoden entschieden habe, die gut aussehen, als schnell genug für ein kommerzielles Spiel zu sein. Es sieht so aus, als müsste ich sowieso nur diesen Weg gehen, da es anscheinend keine Dokumentation über die Cubemap-Methode gibt
Telanor
@Telanor Wenn Ihre Priorität "gut aussehend" ist, können Sie jederzeit die Breite und Höhe der beiden Renderziele erhöhen, die zum Erstellen der DP-Karte verwendet werden. Dann haben Sie eine hochauflösende Textur für die Schatten.
ChrisC
1

Als ich dies zuvor implementiert habe, habe ich einfach jede Würfelfläche einzeln mit einer Standard-2D-Gaußschen Unschärfe verwischt. Sie können möglicherweise Nähte an den Würfelkanten einführen, da die Unschärfe nicht über sie hinweggeht, aber meiner Erfahrung nach war dies kaum jemals erkennbar. YMMV natürlich.

Sie könnten wahrscheinlich sogar eine Unschärfe über die Würfelkanten hinweg ausführen, indem Sie einen Unschärfeshader schreiben, der seine Eingabe in Form einer Cubemap übernimmt und Samples um einen 3D-Vektor verteilt und einen Richtungskegel abtastet. Das klingt jedoch schwierig und langsam, also würde ich versuchen, jedes Gesicht zuerst einzeln zu verwischen.

Nathan Reed
quelle
Ich habe das nicht speziell ausprobiert, weil es so aussah, als wären die Nähte sehr offensichtlich, aber ich werde es ausprobieren und sehen, wie es aussieht. Ihr 2. Vorschlag ist wahrscheinlich die Antwort, aber ich bin nicht sicher, wie ich die Proben ändern soll, ich verstehe Unschärfen nicht wirklich gut
Telanor
Nachdem ich in den letzten 2 Tagen ein- und ausgeschaltet hatte, konnte ich die 2D-Abtastkoordinaten nicht in 3D konvertieren, um die Cubemap korrekt zu verwischen. Es sieht also so aus, als würde ich die Dual-Paraboloid-Methode verwenden
Telanor
@Telanor, hier ist ein Artikel über das Verwischen der Cross-Face-Cubemap. Vielleicht hilft das. developer.amd.com/media/gpu_assets/…
Nathan Reed
Ich habe diesen Artikel gesehen, aber er ist mir bei weitem nicht detailliert genug. Vielleicht jemand mit viel mehr Erfahrung, als ich es durch einfaches Lesen einer solchen Beschreibung umsetzen könnte, aber ich bin nur ein Anfänger in der 3D-Programmierung; Ich brauche eher ein Tutorial, um es implementieren zu können.
Telanor