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