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.
quelle
Antworten:
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 ...
quelle
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.
quelle