Seite 1 von 1
[DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 13:01
von DomiOh
Hallo,
ich mache für meine Shadow-Map ein Blur. Das empfinde ich als ziemlich langsam.
Gibt es da Möglichkeiten, das ganze zu beschleunigen?
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 14:18
von Schrompf
Nicht viele. Ausnutzung des bilinearen Filters der Grafikkarte durch geschicktes Platzieren der Samples genau auf den Texel-Grenzen. Oder falls Du es noch nicht getan hast: Aufteilung des Blurs in separate Durchgänge für horizontal und vertikal.
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 14:22
von DomiOh
Die separaten Vorgänge habe ich, aber wieso beschleunigt das die ganze Sache?
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 14:24
von Aramis
Weil du Singlepass n^2 Samples machen musst um den gleichen Effekt zu erzielen wie mit zwei getrennten Passes zu je n Samples.
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 15:03
von DomiOh
Wieso dann n^2... Irgendwie verstehe ich das jetzt nicht so ganz...
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 15:17
von Schrompf
Blur mit 5x5 Samples im Single-Pass: 25 Texturzugriffe
Blur mit 5x5 Samples in 2 Passes: 2x jeweils 5 Texturzugriffe
Das eine ist O(n^2), das andere nur O(n).
Re: [DX9] Blur für Shadowmap
Verfasst: 04.06.2009, 15:45
von Aramis
Oder grafisch:
Natürlich, der zweite Pass bringt auch einen gewissen Overhead mit sich, schließlich musst du ja Target/Quelle wechseln. Für *ganz* kleine Blurkernel auf geringer Auflösung ist die Singlepass-Variante also zumindest theoretisch schneller. In den DX Samples kommt beispielsweise hin und wieder mal (iirc) ein Singlepass (Pseudo)-2D-Kernel mit unregelmäßig verteilten Samples zum Einsatz.
Re: [DX9] Blur für Shadowmap
Verfasst: 05.06.2009, 10:07
von glassbear
DomiOh hat geschrieben:Wieso dann n^2... Irgendwie verstehe ich das jetzt nicht so ganz...
Ein paar Grundlagen: Blur ist ein Filter für ein Signal (=das Bild in diesem Fall) und jeder Pixel muss mit einer 2D-Matrix multipliziert werden.. Meist wird ein
Gaussian Blur eingesetzt, da dies ein linear separierbarer Filter ist:
Computational Complexity. Deshalb kann man statt der Anwendung einer 2D-Matrix auf das gesamte Bild, diese Berechnung zerlegen in:
1. 1D-Filter in horizontaler Richtung
2. 1D-Filter in vertikaler Richtung
Das verringert die Berechnungskomplexität von
O(wk * hk * wi * hi) auf
O(wk * wi * hi) + O(hk * wi * hi) mit
wk = kernel width
hk = kernel height (==> die Größe der 2D-Matrix)
wi = Image Width
hi = Image Height (==> Größe des Signals)
Beispiel für 5x5 Kernel auf 720p:
2D: O(5 * 5 * 1280 * 720) ==> 24.040.000 Berechnungen
1D: O(5 * 1280 * 720) + O(5 * 1280 * 720) ==> 9.216.000 Berechnungen
Irgendwie hat das dt. Wikipedia zu diesem Thema kaum Inhalt :(
PS: Ich hoffe, ich hab nix durcheinander gebracht, ist schon ein paar Jährchen her :mrgreen: