Antyaliasing / Filtrowanie w Ray Tracing


20

W przypadku śledzenia promieni / ścieżki, jednym z najprostszych sposobów wygładzania obrazu jest superpróbkowanie wartości pikseli i uśrednianie wyników. TO ZNACZY. zamiast strzelać do każdej próbki przez środek piksela, próbki są przesunięte o pewną wartość.

Podczas wyszukiwania w Internecie znalazłem dwie nieco różne metody:

  1. Generuj próbki w dowolny sposób i waż wynik za pomocą filtra
    • Jednym z przykładów jest PBRT
  2. Wygeneruj próbki o rozkładzie równym kształtowi filtra


Generuj i waż

Podstawowym procesem jest:

  1. Twórz próbki w dowolny sposób (losowo, stratyfikowane sekwencje, sekwencje o niskiej rozbieżności itp.)
  2. Odsuń promień kamery za pomocą dwóch próbek (xiy)
  3. Renderuj scenę za pomocą promienia
  4. Obliczyć masę za pomocą funkcji filtra i odległości próbki w stosunku do środka piksela. Na przykład Filtr skrzynkowy, Filtr namiotowy, Filtr Gaussa itp.) Filtruj kształty
  5. Zastosuj wagę do koloru z renderowania


Generuj w kształcie filtra

Podstawowym założeniem jest użycie odwrotnego próbkowania transformacji do tworzenia próbek, które są rozmieszczone zgodnie z kształtem filtra. Na przykład histogram próbek rozmieszczonych w kształcie Gaussa wyglądałby następująco:
Histogram Gaussa

Można to zrobić dokładnie lub przez binowanie funkcji do osobnego pliku pdf / cdf. smallpt używa dokładnie odwrotnego cdf filtra namiotu. Przykłady metody binowania można znaleźć tutaj


pytania

Jakie są zalety i wady każdej metody? A dlaczego miałbyś używać jednego nad drugim? Mogę wymyślić kilka rzeczy:

Generowanie i ważenie wydaje się najbardziej niezawodne, umożliwiając dowolną kombinację dowolnej metody próbkowania z dowolnym filtrem. Wymaga to jednak śledzenia ciężarów w ImageBuffer, a następnie ostatecznego rozwiązania.

Generuj w kształcie filtra może obsługiwać tylko pozytywne kształty filtrów (tj. Bez Mitchella, Catmull Roma lub Lanczosa), ponieważ nie możesz mieć negatywnego pliku pdf. Ale, jak wspomniano powyżej, łatwiej jest go wdrożyć, ponieważ nie trzeba śledzić żadnych wag.

Chociaż ostatecznie myślę, że można myśleć o metodzie 2 jako uproszczeniu metody 1, ponieważ zasadniczo wykorzystuje ona domyślną wagę filtra Box.


Tylko głośno myślę ... Czy możesz osobno modelować ujemną część filtra, aby wygenerować dwa zestawy próbek, jeden traktowany jako dodatni, a drugi jako ujemny? Czy pozwoliłoby to na dowolne filtry dla twojego drugiego podejścia (generowanie w kształcie filtra)?
trichoplax

Może? Pozwól mi się trochę z tym
bawić

1
Ok, jeśli śledzisz zera funkcji, możesz abs () wyprowadzić dane wyjściowe do pliku pdf. Następnie podczas próbkowania możesz sprawdzić, czy masz wynik ujemny. Przykładowy kod tutaj: gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

Odpowiedzi:


9

Istnieje świetny artykuł z 2006 roku na ten temat, Filtruj ważność próbkowania . Proponują metodę 2, badają właściwości i ogólnie popierają ją. Twierdzą, że ta metoda zapewnia płynniejsze wyniki renderowania, ponieważ waży wszystkie próbki, które mają równy udział w pikselu, zmniejszając w ten sposób wariancję końcowych wartości pikseli. Ma to pewien sens, ponieważ jest to ogólna maksyma w renderowaniu Monte Carlo, że próbkowanie według ważności da mniejszą wariancję niż próbki ważone.

Metoda 2 ma również tę zaletę, że jest nieco łatwiejsza do zrównoleglenia, ponieważ obliczenia każdego piksela są niezależne od wszystkich innych pikseli, podczas gdy w metodzie 1 wyniki próbek są dzielone między sąsiednie piksele (a zatem muszą być synchronizowane / przekazywane w jakiś sposób, gdy piksele są równoległe w poprzek wiele procesorów). Z tego samego powodu łatwiej jest wykonać adaptacyjne próbkowanie (więcej próbek w obszarach o dużej zmienności obrazu) przy użyciu metody 2 niż metody 1.

W artykule eksperymentowali także z filtrem Mitchella, próbkując z abs () filtra, a następnie ważąc każdą próbkę za pomocą +1 lub -1, jak sugeruje @trichoplax. Ale ostatecznie faktycznie zwiększyło to wariancję i było gorsze niż metoda 1, więc doszli do wniosku, że metoda 2 nadaje się tylko do filtrów dodatnich.

Biorąc to pod uwagę, wyniki z tego artykułu mogą nie mieć uniwersalnego zastosowania i może być nieco zależne od sceny, która metoda próbkowania jest lepsza. Napisałem wpis na blogu dotyczący tego pytanianiezależnie w 2014 r., używając syntetycznej „funkcji obrazu” zamiast pełnego renderowania, i znalazł metodę 1, aby uzyskać bardziej przyjemne wizualnie wyniki dzięki ładniejszemu wygładzaniu krawędzi o wysokim kontraście. Benedikt Bitterli również skomentował ten post, zgłaszając podobny problem ze swoim rendererem (nadmierny hałas o wysokiej częstotliwości wokół źródeł światła podczas korzystania z metody 2). Poza tym odkryłem, że główną różnicą między metodami była częstotliwość powstającego hałasu: metoda 2 daje szum o wyższej częstotliwości, „wielkości piksela”, podczas gdy metoda 1 daje szum „ziaren” o średnicy 2-3 pikseli, ale amplituda hałasu była podobna dla obu, więc to, który rodzaj hałasu wygląda mniej źle, jest prawdopodobnie kwestią osobistych preferencji.


Dzięki! To są świetne zasoby. Tak więc ostatecznie są 3 metody? 1. Generuj i waż z rozpryskiwaniem 2. Generuj i waż bez rozpryskiwania 3. Generuj w kształcie filtra
RichieSams

Czy znasz jakieś papiery, blogi itp., Które badają, jak zrównoważyć Generowanie i Waga z rozpryskiwaniem? Z czubka mojej głowy możesz mieć muteks na płytkę lub sprawić, że każdy piksel będzie atomowy.
RichieSams,

2
@RichieSams Nie wiem, dlaczego właściwie użyłbyś „generowania i ważenia bez rozpryskiwania” - wygląda na to, że w każdym razie byłoby gorzej niż próbkowanie ważności filtra. Zakładałem, że „generowanie i ważenie” oznacza rozpryskiwanie. Jeśli chodzi o równoległość rozpryskiwania, z czubka mojej głowy, jednym ze sposobów byłoby podzielenie obrazu na kafelki, ale nadanie każdej płytce 2–3 pikseli obramowania, aby uchwycić sploty przekraczające krawędź kafelka. Następnie, w ostatnim przejściu, dodatkowo połącz graniczne kafelki razem w ostateczny obraz.
Nathan Reed
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.