PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Softshadows mittels Shadowmapping


Asmodeus
2006-05-08, 12:53:34
Ich sitze jetzt schon seit längerer Zeit an dem Problem der Softshadows mittels Shadowmapping. Zuerst habe ich mal ein Bild, in dem ich die drei Techniken, mit denen ich mich bisher beschäftigt habe nebeneinander darstelle:

http://www.inf.uni-konstanz.de/~colditz/shadow.jpg

Ganz links wird Percentage-Closer Filterung unter Einbeziehung von bis zu 64 umliegenden Samples verwendet. Störend wirken dabei auf mich die Penumbrabereiche bei der Betrachtung aus der Nähe.

Auf dem mittleren Bild werden Variance Shadowmaps verwendet. Dabei stören mich zum einen der höhere Speicherverbrauch und diese Halo-Artefakte. Zum anderen schein man den Filterkernel für den Blureffekt ziemlich groß wählen zu müssen, damit der Schatten keine Treppenartefakte mehr aufweist. Dadurch wird der Softbereich natürlich aber auch sehr breit.

Auf dem Bild ganz rechts habe ich nun noch eine eigene Methode getestet. Dabei ist gewährleistet, dass keine Treppenartefakte auftreten, egal in welcher Zoomstufe und das Shaderaliasing wird auch wirksam unterdrückt. Man hat also immer diese leichte Softkante, wie zu sehen ist. Und mehr Texturspeicher wird auch nicht benötigt.

Nun aber zu meinem Problem, ich habe meine Sache bisher nur prototypisch getestet und bin mir was das Laufzeitverhalten anbelangt noch nicht ganz im klaren, ob sich die ganze Sache gegenüber den anderen Methoden überhaupt lohnt. Erstmal würde ich gern wissen, wie ihr die drei Methoden rein visuell bewerten würdet. Und dann würde mich interessieren, ob jemand eine grobe Abschätzung geben kann, was im direkten Vergleich schneller laufen könnte:

Bei Methode 1 (wie Bild ganz links) würden bis zu 64 Texturzugriffe pro Fragment notwendig werden, wobei mittels Branching und zweistufigem Sample-Shadow-Test die Zugriffe im Mittel niedriger liegen.

Bei meiner Mehtode könnte man mittels Branching auch entscheiden, ob das Fragment für eine weitere Betrachtung überhaupt in Frage kommt, oder nicht. Und wenn,dann würden etwa weitere 8 Texturzugriffe, 16 ADDs, 40 SUBs, 36 MULs, 8 DIVs, 4 DOTs, 2 Ableitungen und eine Hermite-Interpolation anfallen. Kann da vielleicht jemand eine Aussage dazu treffen, was schneller laufen könnte? Der Implementierungsaufwand ist halt nicht unerheblich und ich möchte nicht erst hinterher feststellen müssen, dass 64 Texturzugriffe und etwas Rechnerei doch schneller sind.

Gruss, Carsten.

Expandable
2006-05-09, 17:34:07
Könntest Du vielleicht mal aussagekräftigere Bilder posten? Weil irgendwie kann ich da oben nicht beurteilen, was besser ausschaut ;o)

Asmodeus
2006-05-10, 10:41:37
Expandable[/POST]']Könntest Du vielleicht mal aussagekräftigere Bilder posten? Weil irgendwie kann ich da oben nicht beurteilen, was besser ausschaut ;o)

Na sicher doch:

Bei der Nvidia-Demo sieht man eben ab einem gewissen Abstand diesen "pixeligen" Softshadow-Bereich, wie oben in dem kleinen Ausschnitt dargestellt.

http://www.inf.uni-konstanz.de/~colditz/shadow01.jpg

Bei der VSM-Demo sieht man diesen nicht korrekten Halo-Effekt bei sich überlagernden Schatten von unterschiedlichen Objekten (roter Kringel).

http://www.inf.uni-konstanz.de/~colditz/shadow02.jpg

Bei meiner Methode sieht die Kante in jeder Zoomstufe so aus, wie oben auf dem kleinen Aussschnitt, deshalb habe ich da jetzt nicht noch ein großes Bild mit schwarzer Kante auf weißem Hintergrund gemacht. ;)

Gruss, Carsten.

Expandable
2006-05-10, 14:06:01
Also folgendes:

1.) Dieses "Pixelige" bei den nVidia Softshadows fand ich schon in 3DMark06 extrem hässlich und störend.

2.) Die Artefakte bei den Variance Shadow Maps rühren doch von der niedrigen Genauigkeit (FP16) her, oder? Falls Du eh hauptsächlich neuere Hardware (G80 & CO) anpeilst, könntest Du das mit FP32 Rendertargets wohl minimieren. Allerdings wird das wohl selbst auf NextGen-Karten wohl trotzdem saulahm.

3.) Wenn bei Deiner Methode keine Artefakte entsehen, wird die wohl am besten aussehen.

Zur Geschwindigkeit kann ich nur schätzen. Fakt ist wohl, dass die arithmetische Rechenleistung gegenüber der Texturesampling-Leistung stärker zunehmen wird. So gesehen müsste ein R580 bei Deiner Methode deutlich schneller sein als ein R520, zukünftige Hardware sollte mit Deiner Methode wohl auch besser skalieren als mit den 64 Texturzugriffen. Die Frage ist ja auch, inwiefern der Compiler Deinen Shader optimieren kann. Ich weiß jetzt z.B. nur vom NV40, dass er, während er auf die Texturdaten wartet, noch eine Berechnung ausführen kann, also Texturlatenzen etwas verstecken kann (bei ATi wird das wohl ähnlich sein). Aber am besten wäre wohl wirklich eine einfache Prototyp-Implementierung zum Ausprobieren.

Expandable
2006-06-05, 22:22:24
Was ist eigentlich daraus geworden, wenn man fragen darf? Für welches Verfahren hast Du Dich entschieden? Gibt's Screenshots? ;)

del_4901
2006-06-05, 22:28:52
in den GPU Gems sind einige Ansätze zu SoftShadowing beschrieben, ich werde mich damit auch mal außeinandersetzen, weil das doch sehr zum Realismus beiträgt.

Asmodeus
2006-06-06, 09:16:45
Expandable[/POST]']Was ist eigentlich daraus geworden, wenn man fragen darf? Für welches Verfahren hast Du Dich entschieden? Gibt's Screenshots? ;)

Momentan liegt dieses Teilproblem bei mir erstmal wieder auf Eis. Im Prinzip liefert mein Ansatz immer die meiner Meinung nach besten visuellen Ergebnisse, nur leider hapert es oft an der Berechenbarkeit (Gradienten etc.) oder eher gesagt am zu betreibenden Berechnungsaufwand. So bin ich immer noch unschlüssig, was ich nun letztendlich verwenden soll und suche erstmal weiter nach möglichen Alternativen.

Gruss, Carsten.