Anti-Aliasing / Filterung in Ray Tracing


20

Bei der Raytracing- / Pfadverfolgung besteht eine der einfachsten Möglichkeiten zum Antialiasing des Bildes darin, die Pixelwerte zu überabtasten und die Ergebnisse zu mitteln. IE. Anstatt jedes Sample durch die Mitte des Pixels zu schießen, versetzen Sie die Samples um einen gewissen Betrag.

Bei der Suche im Internet habe ich zwei unterschiedliche Methoden gefunden:

  1. Generieren Sie Proben nach Belieben und wägen Sie das Ergebnis mit einem Filter ab
    • Ein Beispiel ist PBRT
  2. Generieren Sie die Samples mit einer Verteilung, die der Form eines Filters entspricht


Generieren und wiegen

Der grundlegende Prozess ist:

  1. Erstellen Sie Stichproben, wie Sie möchten (zufällige, geschichtete Sequenzen mit geringer Diskrepanz usw.).
  2. Versetzen Sie den Kamerastrahl mit zwei Samples (x und y)
  3. Rendern Sie die Szene mit dem Strahl
  4. Berechnen Sie mit Hilfe einer Filterfunktion ein Gewicht und den Abstand des Samples zur Pixelmitte. Zum Beispiel Box-Filter, Zelt-Filter, Gauß-Filter usw.) Formen filtern
  5. Wenden Sie das Gewicht auf die Farbe aus dem Render an


In Form eines Filters generieren

Die Grundvoraussetzung ist die Verwendung von Inverse Transformation Sampling , um Samples zu erstellen, die entsprechend der Form eines Filters verteilt sind. Zum Beispiel wäre ein Histogramm eines Samples, das in der Form eines Gaußschen verteilt ist:
Gaußsches Histogramm

Dies kann entweder exakt erfolgen oder durch Binden der Funktion in ein diskretes pdf / cdf. smallpt verwendet die exakte Inverse cdf eines Zeltfilters. Beispiele für Binning-Methoden finden Sie hier


Fragen

Was sind die Vor- und Nachteile jeder Methode? Und warum sollten Sie eins übereinander verwenden? Ich kann mir ein paar Dinge vorstellen:

Generieren und Wiegen scheint die robusteste Methode zu sein, die eine beliebige Kombination einer beliebigen Probenahmemethode mit einem beliebigen Filter ermöglicht. Sie müssen jedoch die Gewichte im ImageBuffer nachverfolgen und anschließend eine endgültige Auflösung vornehmen.

Das Generieren in Form eines Filters unterstützt nur positive Filterformen (z. B. keine Mitchell-, Catmull-Rom- oder Lanczos-Filter), da Sie keine negativen PDF-Dateien haben können. Wie oben erwähnt, ist die Implementierung jedoch einfacher, da Sie keine Gewichte nachverfolgen müssen.

Letztendlich kann man sich Methode 2 jedoch als eine Vereinfachung von Methode 1 vorstellen, da sie im Wesentlichen eine implizite Box-Filter-Gewichtung verwendet.


Laut denken ... Könnten Sie den negativen Teil eines Filters separat modellieren, um zwei Sätze von Samples zu generieren, von denen einer als positiv und der andere als negativ behandelt wird? Würde dies beliebige Filter für Ihren zweiten Ansatz zulassen (in Form eines Filters erzeugen)?
Trichoplax

Vielleicht?
Lass mich

1
Ok, wenn Sie die Nullen der Funktion verfolgen, können Sie die Ausgabe in das PDF abs (). Dann können Sie beim Abtasten prüfen, ob Sie negativ sind. Beispielcode hier: gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

Antworten:


9

Zu diesem Thema gibt es eine großartige Veröffentlichung aus dem Jahr 2006, Filter Importance Sampling . Sie schlagen Ihre Methode 2 vor, untersuchen die Eigenschaften und sprechen sich generell dafür aus. Sie behaupten, dass diese Methode glattere Rendering-Ergebnisse liefert, da alle Samples, die zu einem Pixel beitragen, gleich gewichtet werden, wodurch die Varianz der endgültigen Pixelwerte verringert wird. Dies ist einigermaßen sinnvoll, da es in Monte Carlo eine allgemeine Maxime ist, dass die Wichtigkeitsabtastung eine geringere Varianz ergibt als gewichtete Abtastungen.

Methode 2 hat auch den Vorteil, dass die Parallelisierung etwas einfacher ist, da die Berechnungen jedes Pixels unabhängig von allen anderen Pixeln sind, während in Methode 1 die Abtastergebnisse über benachbarte Pixel hinweg geteilt werden (und daher irgendwie synchronisiert / kommuniziert werden müssen, wenn Pixel über parallelisiert werden mehrere Prozessoren). Aus dem gleichen Grund ist es mit Methode 2 einfacher, adaptive Abtastungen durchzuführen (mehr Abtastungen in Bereichen mit hoher Varianz des Bildes) als mit Methode 1.

In der Arbeit experimentierten sie auch mit einem Mitchell-Filter, indem sie von abs () des Filters abtasteten und dann jede Probe mit +1 oder −1 gewichteten, wie @trichoplax vorschlug. Dies hat jedoch letztendlich die Varianz erhöht und ist schlechter als Methode 1, sodass sie zu dem Schluss kommen, dass Methode 2 nur für positive Filter verwendbar ist.

Abgesehen davon sind die Ergebnisse dieser Arbeit möglicherweise nicht universell anwendbar, und es kann etwas szenenabhängig sein, welche Abtastmethode besser ist. Ich hab geschrieben einen Blog-Beitrag geschrieben, der diese Frage untersuchtWir haben 2014 unabhängig eine synthetische "Bildfunktion" anstelle eines vollständigen Renderings verwendet und festgestellt, dass Methode 1 zu visuell ansprechenderen Ergebnissen führt, da Kanten mit hohem Kontrast besser geglättet werden. Benedikt Bitterli äußerte sich auch zu diesem Beitrag und berichtete über ein ähnliches Problem mit seinem Renderer (übermäßiges hochfrequentes Rauschen um Lichtquellen bei Verwendung von Methode 2). Darüber hinaus stellte ich fest, dass der Hauptunterschied zwischen den Methoden die Frequenz des resultierenden Rauschens war: Methode 2 ergibt ein höherfrequentes "pixelgroßes" Rauschen, während Methode 1 Rausch- "Körner" mit einem Durchmesser von 2-3 Pixel ergibt Die Amplitude des Rauschens war für beide ähnlich. Welche Art von Rauschen weniger schlecht aussieht, ist wahrscheinlich eine Frage der persönlichen Präferenz.


Vielen Dank! Das sind großartige Ressourcen. Also, am Ende gibt es 3 Methoden? 1. Generieren und wiegen mit splatting 2. Generieren und wiegen ohne splatting 3. Generieren in Form eines Filters
RichieSams

Kennen Sie Papiere, Blogs usw., in denen untersucht wird, wie Generieren und Gewichten mit dem Splattern parallelisiert werden können? Aus meinem Kopf heraus könnten Sie einen Mutex pro Kachel haben oder jedes Pixel atomar machen.
RichieSams

2
@RichieSams Ich weiß nicht, warum Sie "generieren und wiegen, ohne zu splattern" verwenden würden - das scheint auf jeden Fall schlimmer zu sein als die Filter-Wichtigkeits-Abtastung. Ich nahm an, dass "generieren und wiegen" das Splattern impliziert. Was die Parallelisierung des Splattens anbelangt, besteht eine Möglichkeit darin, das Bild in Kacheln zu unterteilen, aber jeder Kachel einen Rand von 2 × 3 Pixeln zuzuweisen, um Splats aufzufangen, die die Kachelkante überschreiten. Fügen Sie dann in einem letzten Durchgang die umrandeten Kacheln additiv zum endgültigen Bild zusammen.
Nathan Reed
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.