Warum sollte ein Zeltfilter für die Pfadverfolgung verwendet werden?

12

Die 99 Zeilen des C-Pfad-Tracers Smallpt rendern ein 2x2-Subpixel-Raster für jedes Pixel, das gerendert werden soll , und führen dann einen Zeltfilter durch , um sie zu kombinieren.

Es gibt eine interessante Präsentation, die den Code hier erklärt und den Zeltfilter erwähnt, aber nicht erklärt, warum er dort ist.

Kann jemand erklären, warum ein Zeltfilter in diesem Fall einer Kastenunschärfe vorzuziehen wäre (nur die Mittelung der Proben)?

Wäre es von höherer Qualität, etwas Besseres als einen Zeltfilter wie die bikubische Einsiedlerinterpolation zu wählen?

Alan Wolfe
quelle

Antworten:

13

Das theoretisch ideale Antialiasing-Filter für diskret abgetastete Daten ist ein Sinc-Filter , da es alle Frequenzen, die höher als die Nyquist-Frequenz sind, perfekt entfernt, während alle niedrigeren Frequenzen unberührt bleiben. In gewissem Maße können wir daher Antialiasing-Filter erwarten, die dem Sinc-Filter ähnlicher sind, um Bilder mit besserer Qualität zu erzeugen.

Das Zeltfilter (Dreiecksfilter) ähnelt mit Sicherheit der zentralen Spitze des Zinkfilters stärker als das Kastenfilter:

Sinc-, Triangel- und Box-Filter

Ein bikubischer Filter (z. B. Mitchell-Netravali) könnte die Form des Sinc, einschließlich der ersten beiden negativen Lappen, noch genauer erfassen.

Die Realität der Filterauswahl ist etwas subtiler als "so gut wie möglich annähernd", da es verschiedene Arten von Artefakten gibt, die durch "nicht ideale" Antialiasing-Filter wie Aliasing, Überblenden und Klingeln erzeugt werden können. Auch können unterschiedliche Filter mehr oder weniger rechenintensiv sein. Es ist also ein Spiel, bei dem versucht wird, die verschiedenen Artefakte gegeneinander und gegen die Leistung auszutauschen. Verschiedene Szenen / Bilder können die eine oder andere Wahl begünstigen, und es ist auch teilweise eine ästhetische Beurteilung.

Was den Grund für die Verwendung eines Zeltfilters in Smallpt angeht, würde ich eine Kombination aus Leistung (es ist ein schnell zu bewertender Filter) und Kürze schätzen - dies kann in wenigen Codezeilen erfolgen, während ein bikubischer Filter eine Menge mehr benötigt Code.

Im Übrigen verwendet smallpt tatsächlich ein 2x2-Subpixel-Raster und platziert einen Zeltfilter an jedem Subpixel . Anschließend werden die Ergebnisse der vier Subpixel gemittelt. Der Gesamteffekt ist also seltsamerweise der der Summe von vier Zelten, die wie eine Pyramide mit einer flachen Oberseite aussehen:

Subpixel-Zeltfilter

Ich bin mir nicht sicher, ob dies beabsichtigt war oder einfach so, wie es funktionierte. Ich vermute, dass dies zu einem etwas schärferen Bild führt, als wenn ein einzelner Zeltfilter pro Pixel verwendet würde (aufgrund der engeren Unterstützung), aber wahrscheinlich auch zu einem sichtbareren Aliasing.

Nathan Reed
quelle
Ich kann nicht anders als Danke zu sagen! Eigentlich verstehe ich das zunächst als geschichtete Stichprobe mit 4 Schichten. Und ich mache die Anzahl der "Schichten" anpassbar, wie 9, 16 ... Jetzt weiß ich, dass es ein "Trapez" -Filter ist (nicht so häufig in anderen Renderern). Und da die Anzahl meiner "Schichten" tendenziell unendlich ist, wird der Filter zu einem Kastenfilter, in dem ich die Lilie male ... Interessant!
Chaosink
3

Ich habe mir gerade Wikipedia-Artikel über bilineare Interpolation angesehen. Ein Zeltfilter ist eine Art bilineare Interpolation. Eine bilineare Interpolation interpoliert auf 2 Dimensionen. Es interpoliert zuerst linear auf einer Dimension und dann auf der anderen.

Bildbeschreibung hier eingeben

Wenn Sie sich dieses Bild ansehen, wird es zum Beispiel zuerst in der Spalte und dann in der Zeile angezeigt.

Der Grund, warum dies besser sein könnte, als Farben zu mitteln, ist, dass wenn einer der Punkte näher am Zentrum liegt als ein anderer, er mehr zur endgültigen Farbe beiträgt. Bei der Mittelung der Farben werden alle Punkte gleichermaßen berücksichtigt, auch wenn ein Punkt näher am Zentrum liegt als ein anderer Punkt.

Befinden sich alle 4 Punkte auf festen Positionen in gleichem Abstand vom Zentrum, erhalten Sie für alle Punkte genau 25% Beitrag, das entspricht der Mittelung.

Dies bedeutet, dass Sie Anti-Aliasing implementieren, indem Sie nur mit der vierfachen Auflösung rendern und es dann herunterrechnen. Die Ausgabe zwischen den beiden Möglichkeiten sollte meines Wissens gleich sein.

Welchen Filter sollten Sie also verwenden? Nun, es hängt davon ab, was Sie wollen und Ihre Situation. Wenn Sie zufällige Subpixel-Positionen für Ihre Samples auswählen, ist es möglicherweise besser, eine bilineare Interpolation zu verwenden. Wenn alle Punkte festgelegt sind und Sie nur mit einer höheren Auflösung rendern, kann eine Mittelung hilfreich sein. Am Ende sind das alles nur einige Subpixel-Dinge, die Sie normalerweise nicht oder kaum bemerken. Wenn es also eine Art von AA gibt, dann ist es gut genug. Aber das ist nur meine Meinung und wahrscheinlich die eines durchschnittlichen Betrachters von 3D-Animationen oder Ähnlichem.

Eine bikubische Interpolation sorgt für ein flüssigeres Aussehen. Bikubisch: Bildbeschreibung hier eingeben

Bilinear: Bildbeschreibung hier eingeben

Welches ist besser? Nun, es hängt davon ab, was Sie mögen, und ich glaube nicht, dass es einen großen Unterschied geben wird.

Meine Quellen: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https://en.wikipedia.org/wiki/Bicubic_interpolation

(Bilder stammen aus Wikipedia und sind gemeinfrei)

Ich hoffe, das hilft, ich möchte nur sagen, dass ich kein Profi bin, ich bin nur jemand, der nur Computergrafik mag. Es könnte sein, dass ich einige Fehler gemacht habe. Wenn ja, sag es einfach und ich ändere es!

bram0101
quelle