Po co używać filtra namiotu do śledzenia ścieżki?

12

99 linii znacznika ścieżki C Smallpt renderuje siatkę subpikseli 2x2 dla każdego piksela, który zamierza renderować, a następnie wykonuje filtr namiotu, aby je połączyć.

Jest to interesująca prezentacja wyjaśniając kod tutaj , i wymienia filtr namiot, ale nie wyjaśnia, dlaczego on tam jest.

Czy ktoś może wyjaśnić, dlaczego filtr namiotu byłby w tym przypadku lepszy niż rozmycie pola (po prostu uśrednianie próbek)?

Czy lepiej byłoby zastosować coś lepszego niż filtr namiotowy, na przykład dwuububową interpolację pustelniczą?

Alan Wolfe
źródło

Odpowiedzi:

13

Teoretycznie idealnym filtrem antyaliasingu dla dyskretnie próbkowanych danych jest filtr cynkowy , ponieważ doskonale usuwa wszystkie częstotliwości wyższe niż częstotliwość Nyquista, pozostawiając w spokoju wszystkie niższe. Tak więc do pewnego stopnia możemy spodziewać się filtrów antyaliasingu, które bardziej przypominają filtr sinc w celu uzyskania lepszej jakości zdjęć.

Filtr namiotowy (filtr trójkątny) z pewnością przypomina centralny szczyt filtra cynkowego bardziej niż filtr pudełkowy:

filtry cynkowe, trójkątne i pudełkowe

Dwububowy filtr (np. Mitchell-Netravali) mógłby jeszcze dokładniej uchwycić kształt cynku, w tym jego pierwsze dwa ujemne płaty.

Rzeczywistość wyboru filtra jest nieco bardziej subtelna niż „przybliżenie sinusa, jak to możliwe”, ponieważ istnieją różne rodzaje artefaktów, które mogą być generowane przez „nie idealne” filtry antyaliasingowe, takie jak aliasing, nadmierne rozmycie i dzwonienie. Ponadto różne filtry mogą być mniej lub bardziej drogie obliczeniowo. Jest to więc gra polegająca na próbie wymiany różnych artefaktów przeciwko sobie i na wydajność. Różne sceny / obrazy mogą sprzyjać takiemu wyborowi, a częściowo jest to również ocena estetyczna.

Jeśli chodzi o to, dlaczego smallpt korzysta w szczególności z filtra namiotu, zgaduję, że potrzebna jest kombinacja wydajności (jest to szybki filtr do oceny) i zwięzłości - można to zrobić za pomocą kilku linii kodu, podczas gdy filtr bicubic zająłby sporo więcej kod.

Nawiasem mówiąc, smallpt faktycznie używa siatki subpikseli 2x2 i umieszcza filtr namiotu na każdym subpikselu , a następnie uśrednia wyniki czterech subpikseli. Co ciekawe, ogólny efekt to suma czterech namiotów, które wyglądają jak piramida z płaskim szczytem:

filtry namiotowe subpixel

Nie jestem pewien, czy było to celowe, czy po prostu tak się udało. Domyślam się, że skutkuje to nieco ostrzejszym obrazem niż w przypadku użycia jednego filtra namiotu na piksel (z powodu węższej obsługi), ale prawdopodobnie również bardziej widocznego aliasingu.

Nathan Reed
źródło
Nie mogę się powstrzymać od podziękowania! Aktalnie najpierw rozumiem to jako próbkowanie warstwowe z 4 warstwami. I dostosowuję liczbę „warstw”, na przykład 9, 16 ... Teraz wiem, że jest to filtr „trapezoidalny” (nie tak powszechny w innych programach renderujących). A ponieważ liczba moich „warstw” ma tendencję do nieskończoności, filtr staje się filtrem pudełkowym, w którym maluję lilię… Ciekawe!
chaosink
3

Właśnie obejrzałem artykuły w Wikipedii na temat interpolacji dwuliniowej. Filtr namiotowy jest rodzajem interpolacji dwuliniowej. Interpolacja dwuliniowa interpoluje na 2 wymiarach. Najpierw interpoluje liniowo na jednym wymiarze, a następnie na drugim.

wprowadź opis zdjęcia tutaj

Kiedy patrzysz na to zdjęcie, najpierw robi to na kolumnie, a następnie na przykład w wierszu.

Powodem, dla którego może to być lepsze niż uśrednianie kolorów, jest to, że gdy jeden z punktów zbliża się do środka niż inny, przyczynia się bardziej do ostatecznego koloru. Dzięki uśrednieniu kolorów wszystkie punkty mają równy udział, nawet gdy jeden punkt znajduje się bliżej środka niż inny punkt.

Jeśli wszystkie 4 punkty znajdują się na ustalonych pozycjach w równej odległości od centrum, otrzymasz dokładnie 25% wkładu na wszystkie punkty, to tyle samo co uśrednianie.

Oznacza to, że po wdrożeniu wygładzania wystarczy renderowanie w rozdzielczości 4-krotnie wyższej, a następnie próbkowanie w dół. Dane wyjściowe między dwoma sposobami powinny być takie same, o ile je rozumiem.

Którego filtra należy użyć? To zależy od tego, czego chcesz i twojej sytuacji. Jeśli wybierzesz losowe lokalizacje subpikseli dla swoich próbek, lepszym rozwiązaniem może być interpolacja dwuliniowa. Jeśli wszystkie punkty są ustalone, a ty renderujesz tylko w wyższej rozdzielczości, uśrednianie może być przydatne. W końcu to tylko niektóre subpiksele, których normalnie nie zauważasz lub ledwo zauważasz, więc jeśli istnieje jakiś rodzaj AA, to jest wystarczająco dobry. Ale to tylko moja opinia i prawdopodobnie przeciętnego widza animacji 3D lub coś w tym rodzaju.

Dwububowa interpolacja zapewnia gładszy wygląd. Bicubic: wprowadź opis zdjęcia tutaj

Dwuliniowy: wprowadź opis zdjęcia tutaj

Który jest lepszy? To zależy od tego, co lubisz, i nie sądzę, że będzie ogromna różnica.

Moje źródła: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

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

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

(Obrazy pochodzą z Wikipedii i są własnością publiczną)

Mam nadzieję, że to pomaga, chcę tylko powiedzieć, że nie jestem profesjonalistą, jestem po prostu kimś, kto lubi grafiki komputerowe. Możliwe, że popełniłem kilka błędów. Jeśli tak, po prostu powiedz to, a ja to zmienię!

bram0101
źródło