Punktlicht Weiche Schatten

7

So implementieren Sie weiche Schatten für omnidirektionales (Punkt-) Licht. Wir verwenden die typische Shadow-Mapping-Technik. Die Tiefe wird zum Texturwürfel gerendert und das Adressieren ist dann ziemlich einfach. Nur mit Vektor von Licht zu Fragmenten Weltposition. Es funktioniert perfekt. Bis du weiche Schatten willst. In unserem Motor verwenden wir die PCSS-Technik für Scheinwerfer. Aber für Punktlicht beginnen Probleme.

Wie probiere ich in 3D?

Ich habe eine Technik entwickelt, bei der eine orthonormale Basis aus einer Richtung und einem Aufwärtsvektor (0,1,0) erstellt wird. Und dann multiplizieren Sie den Abtastvektor (so etwas wie diesen (1.0, i / depthMapSize, j / depthMapSize) mit dieser Basis. Aber das (natürlich :)) sieht für Vektoren in der Nähe von (0,1,0) und (0, - ziemlich schlecht aus 1,0).

Ich werde mich über jede Hilfe freuen.

Notabene
quelle
Da dies immer noch nicht gelöst ist, möchte ich diese Frage offen lassen. Vielleicht werde ich eines Tages meine Lösung veröffentlichen, weil wir das wirklich herausfinden müssen. Trotzdem würde ich mich sehr über Ideen freuen
Notabene
Ihre Frage ist mir wirklich nicht klar. Es hört sich so an, als hätten Sie Punktlichter mithilfe einer Würfelschattenkarte implementiert. Weiche Schatten, die diese Technik verwenden, sind dieselben wie beim Implementieren von Schatten für Richtungs- oder Punktlichter. Haben Sie schon einmal weiche Schatten mit einem Punkt oder einem gerichteten Licht implementiert? Die Prinzipien sind die gleichen.
Olhovsky
@olhovsky: Sicher, wir haben typisches PCSS implementiert. Das Problem der Schattenwürfelkarte besteht darin, dass sie mit einem 3D-Vektor abgetastet wird und die Schattenkarte mit Punktlicht in 2D abgetastet wird PCSS in 2D. Meine orthonormale Probenahmebasis erzeugt Artefakte, aber es wurde bewiesen, dass es funktioniert (aber ich glaube, dass es eine bessere Lösung gibt).
Notabene
Notabene: Die PCF-Filterung mildert nur die Schattenkanten und hilft Ihnen nicht, die Auflösung der Schattenkarte im Lichtraum besser zu nutzen. Dazu müssen Sie auch eine Technik wie PSSM / CSM verwenden. Ich habe eine Antwort hinzugefügt, die bestätigt, wo wir die Diskussion fortsetzen können.
Olhovsky
Als Reaktion auf das Abtasten des Würfels mit einem 3D-Vektor: Sie wenden einfach eine beliebige Schattenkartentechnik auf die 2D-Seiten des Würfels an, tasten dann alle 6 Seiten ab und mischen sie entsprechend. Sie können sich PSSM als viele Würfel vorstellen, wenn Sie es lieber so sehen möchten.
Olhovsky

Antworten:

2

Als einfachen Hack für Ihre aktuelle Technik können Sie zwischen zwei Aufwärtsvektoren wählen, je nachdem, ob Ihr Ansichtsvektor in Richtung parallel zu einem tendiert.

Es wäre nur eine Bauchmuskulatur, vergleiche und wähle in Shader-Begriffen, also nicht viel Aufwand - besonders wenn man das Sampling und Mischen berücksichtigt ...

JasonD
quelle
Danke für die Antwort. Ich habe versucht, was Sie zuvor vorgeschlagen haben, und Sie haben Recht, dies hilft, führt aber zu weiteren Problemen. Ich denke, dass meine Technik Sackgasse ist und ich würde gerne eine neue finden
Notabene
0

Sie verwenden eine Würfelkarte, um die Schatten eines Punktlichts darzustellen.

In diesem Fall entspricht dies in etwa dem Zusammenfügen von 6 Scheinwerfern.

Sie müssen die PCSS-Blockersuche für jede der 6 Schattenkarten durchführen, um einen Halbschattenwert für jede Schattenkarte zu finden (auf die gleiche Weise wie für ein einzelnes Punktlicht).

Dann mischen Sie einfach zwischen den einzelnen Halbschattenwerten, wie Sie es bereits für den bereits implementierten Schattenzuordnungsschritt getan haben.

Dies kann optimiert werden, da ein empfangendes Objekt in höchstens 3 Schattenkarten von einem Objekt blockiert werden kann - es sind also wirklich nur drei PCSS-Blockersuchen erforderlich. Lassen Sie jedoch zuerst die einfachere Version funktionieren.

Olhovsky
quelle