Co to jest próbkowanie według ważności? Każdy artykuł, który o nim czytam, wspomina o „PDF”, co to jest?
Z tego, co zbieram, ważność próbkowania jest techniką próbkowania tylko obszarów na półkuli, które mają większe znaczenie niż inne. Idealnie więc powinienem próbować promienie w kierunku źródeł światła, aby zmniejszyć hałas i zwiększyć prędkość. Ponadto, niektóre BRDF przy kątach wypasu nie mają niewielkiej różnicy w obliczeniach, więc użycie ważnego próbkowania, aby tego uniknąć, jest dobre?
Gdybym miał wdrożyć ważność próbkowania dla BRDF Cook-Torrance, jak mogę to zrobić?
brdf
importance-sampling
Arjan Singh
źródło
źródło
Odpowiedzi:
Krótka odpowiedź:
Ważność próbkowania jest metodą zmniejszania wariancji w integracji Monte Carlo poprzez wybranie estymatora zbliżonego do kształtu rzeczywistej funkcji.
PDF jest skrótem od funkcji gęstości prawdopodobieństwa . Apdf(x) daje prawdopodobieństwo wygenerowania losowej próbki o wartości x .
Długa odpowiedź:
Na początek przejrzyjmy, czym jest integracja Monte Carlo i jak wygląda matematycznie.
Integracja Monte Carlo to technika szacowania wartości całki. Zwykle jest używany, gdy nie ma zamkniętego rozwiązania całki. To wygląda tak:
W języku angielskim oznacza to, że można przybliżać całkę, uśredniając kolejne losowe próbki z funkcji. GdyN staje się duże, przybliżenie zbliża się coraz bardziej do rozwiązania. pdf(xi) reprezentuje funkcję gęstości prawdopodobieństwa każdej próbki losowej.
Zróbmy przykład: Oblicz wartość całkiI .
Użyjmy integracji Monte Carlo:
Prostym programem pythonowym do obliczenia tego jest:
Jeśli uruchomimy program, otrzymamyI=0.4986941
Stosując separację według części, możemy uzyskać dokładne rozwiązanie:
Zauważysz, że rozwiązanie Monte Carlo nie jest całkiem poprawne. Jest tak, ponieważ jest to szacunek. To powiedziawszy, gdy przechodzi w nieskończoność, szacunki powinny być coraz bliżej poprawnej odpowiedzi. Już przy niektóre przebiegi są prawie identyczne z poprawną odpowiedzią.N N=2000
Uwaga na temat pliku PDF: W tym prostym przykładzie zawsze bierzemy jednolitą losową próbkę. Jednolita losowa próbka oznacza, że każda próbka ma dokładnie takie samo prawdopodobieństwo wyboru. Próbkujemy w zakresie więc[0,2π] pdf(x)=1/(2π−0)
Ważność próbkowania polega na tym, że próbkowanie nie jest jednolite. Zamiast tego staramy się wybierać więcej próbek, które mają duży wpływ na wynik (ważne), a mniej próbek, które tylko nieznacznie przyczyniają się do wyniku (mniej ważne). Stąd nazwa, ważność próbkowania.
Jeśli wybierzesz funkcję próbkowania, której pdf bardzo ściśle pasuje do kształtu , możesz znacznie zmniejszyć wariancję, co oznacza, że możesz pobrać mniej próbek. Jeśli jednak wybierzesz funkcję próbkowania, której wartość jest bardzo różna od , możesz zwiększyć wariancję. Zobacz zdjęcie poniżej: Zdjęcie z rozprawy doktorskiej Wojciecha Jarosza Załącznik Af f
Jednym z przykładów ważnego próbkowania w śledzeniu ścieżki jest sposób wyboru kierunku promienia po uderzeniu w powierzchnię. Jeśli powierzchnia nie jest idealnie błyszcząca (tj. Lustro lub szkło), promień wychodzący może znajdować się w dowolnym miejscu na półkuli.
My mogliśmy równomiernie próbki półkulę, aby wygenerować nowy ray. Możemy jednak wykorzystać fakt, że równanie renderowania zawiera w sobie współczynnik cosinus:
W szczególności wiemy, że wszelkie promienie na horyzoncie będą silnie osłabione (w szczególności ). Tak więc promienie generowane w pobliżu horyzontu nie przyczynią się zbytnio do końcowej wartości.cos(x)
Aby temu przeciwdziałać, używamy próbkowania według ważności. Jeśli generujemy promienie zgodnie z półkulą ważoną cosinusem, zapewniamy, że więcej promieni generuje się znacznie powyżej horyzontu, a mniej w pobliżu horyzontu. Obniży to wariancję i zmniejszy hałas.
W twoim przypadku podałeś, że będziesz korzystać z BRDF opartego na mikropacetach Cook-Torrance. Powszechną formą jest:
gdzie
Blog „Notka faceta z grafiki” ma doskonały opis próbkowania BRDF-ów Cook-Torrance. Odsyłam cię do jego postu na blogu . To powiedziawszy, postaram się stworzyć krótki przegląd poniżej:
NDF jest generalnie dominującą częścią Cook-Torrance BRDF, więc jeśli chcemy uzyskać ważność próbki, powinniśmy spróbować na podstawie NDF.
Cook-Torrance nie określa konkretnego NDF do użycia; mamy swobodę wyboru tego, co pasuje do naszych upodobań. To powiedziawszy, istnieje kilka popularnych NDF:
Każdy NDF ma własną formułę, dlatego każdy musi być próbkowany inaczej. Pokażę tylko ostateczną funkcję próbkowania dla każdego. Jeśli chcesz zobaczyć, jak formuła jest uzyskiwana, zobacz wpis na blogu.
GGX jest zdefiniowany jako:
Aby pobrać próbkę sferycznego kąta współrzędnych , możemy użyć wzoru:θ
gdzie jest jednolitą zmienną losową.ξ
Zakładamy, że NDF jest izotropowy, więc możemy próbkować jednolicie:ϕ
Beckmann jest zdefiniowany jako:
Które można próbkować za pomocą:
Wreszcie, Blinn jest zdefiniowany jako:
Które można próbkować za pomocą:
Realizacja w praktyce
Spójrzmy na podstawowy znacznik ścieżki wstecz:
TO ZNACZY. odbijamy się wokół sceny, gromadząc w miarę upływu czasu kolor i tłumienie światła. Przy każdym odbiciu musimy wybrać nowy kierunek promienia. Jak wspomniano powyżej, mogłyby równomiernie próbki półkulę, aby wygenerować nowy ray. Jednak kod jest mądrzejszy; znaczenie pobiera próbki nowego kierunku na podstawie BRDF. (Uwaga: To jest kierunek wprowadzania, ponieważ jesteśmy znacznikiem ścieżki do tyłu)
Które można zaimplementować jako:
Po próbkowaniu inputDirection („wi” w kodzie), używamy go do obliczenia wartości BRDF. Następnie dzielimy przez pdf zgodnie ze wzorem Monte Carlo:
Gdzie Eval () jest samą funkcją BRDF (Lambert, Blinn-Phong, Cook-Torrance itp.):
źródło
wi
? Rozumiem, jak próbkować kąt współrzędnych sferycznych θ, ale jak to zrobić w przypadku rzeczywistego wektora kierunku?Jeśli masz funkcję 1D i chcesz zintegrować tę funkcję od powiedzmy 0 do 1, jednym ze sposobów przeprowadzenia tej integracji jest pobranie N losowych próbek w zakresie [0, 1], oszacuj dla każdego próbkuj i oblicz średnią próbek. Mówi się jednak, że ta „naiwna” integracja Monte Carlo „powoli zbiega się”, tzn. Potrzeba dużej liczby próbek, aby zbliżyć się do prawdy gruntu, szczególnie jeśli funkcja ma wysokie częstotliwości.f(x) f(x)
Dzięki ważnemu próbkowaniu, zamiast pobierania N losowych próbek w zakresie [0, 1], pobiera się więcej próbek w „ważnych” regionach które najbardziej przyczyniają się do końcowego wyniku. Ponieważ jednak próbujesz odchylenie w kierunku ważnych obszarów funkcji, próbki te muszą być ważone mniej, aby przeciwdziałać odchyleniu, czyli tam, gdzie pojawia się PDF (funkcja gęstości prawdopodobieństwa). PDF określa prawdopodobieństwo próbki w danej pozycji i służy do obliczenia średniej ważonej próbek poprzez podzielenie każdej próbki przez wartość PDF w każdej pozycji próbki.f(x)
W przypadku pobierania próbek o znaczeniu ważności Cook-Torrance powszechną praktyką jest dystrybucja próbek w oparciu o normalną funkcję rozkładu NDF. Jeśli NDF jest już znormalizowany, może służyć bezpośrednio jako PDF, co jest wygodne, ponieważ anuluje to określenie z oceny BRDF. Jedyne, co musisz zrobić, to rozdzielić przykładowe pozycje na podstawie PDF i ocenić BRDF bez terminu NDF, tj. I oblicz średnią wyników próbki pomnożoną przez kąt bryłowy domeny, którą integrujesz (np. dla półkuli).
W przypadku NDF należy obliczyć funkcję skumulowanego rozkładu pliku PDF, aby przekonwertować równomiernie rozmieszczoną pozycję próbki na pozycję próbki ważoną w formacie PDF. W przypadku izotropowego NDF upraszcza to funkcję 1D ze względu na symetrię funkcji. Aby uzyskać więcej informacji na temat pochodnej CDF, możesz sprawdzić ten stary artykuł o klejnotach GPU .
źródło