Dodatek B nauczył Cię ogólnej idei importance sampling — próbkuj częściej tam, gdzie wkład i tak jest większy. Ten dodatek stosuje to wprost do kształtu konkretnego loba: jak losować kierunek L tak, żeby prawie każda próbka trafiała tam, gdzie dana BRDF faktycznie coś zwraca, zamiast marnować próbki na kierunki bliskie zeru.
Estymator Monte Carlo z Rozdziału 15 dzieli wkład każdej próbki przez jej gęstość prawdopodobieństwa (pdf), z której ją wylosowano. Jeśli wylosujesz kierunek L z gęstością proporcjonalną do samego cosinusa N·L — zamiast równomiernie po całej hemisferze — cosinus w liczniku równania renderowania i cosinus w mianowniku pdf skracają się do zera roboty:
Praktyczna konstrukcja (Malley's method): weź dwie liczby losowe ξ₁, ξ₂ ∈ [0,1), rzuć punkt równomiernie na dysk jednostkowy, podnieś go prostopadle na hemisferę:
Dlaczego rzut na dysk, a nie coś bardziej „bezpośredniego"? Bo równomierny rozkład punktów na dysku, podniesiony prostopadle na hemisferę, automatycznie gęstnieje bliżej bieguna (N·L blisko 1) i rzednie bliżej równika — dokładnie rozkład proporcjonalny do cosinusa, bez żadnej dodatkowej wagi do policzenia.
Najprostszy sposób próbkowania GGX z Rozdziału 11: losuj H bezpośrednio z rozkładu D(H), potem odbij V względem H, żeby dostać L. Gęstość prawdopodobieństwa w przestrzeni H to pdf_H(H) = D(H)·(N·H); po przejściu przez operację odbicia (jakobian tej transformacji) gęstość w przestrzeni L wynosi:
Problem: D(H) opisuje wszystkie mikrofasetki o normalnej H, łącznie z tymi, które są samo-zasłonięte przez sąsiednie fasetki i z kierunku V w ogóle niewidoczne (dokładnie ten człon G z Rozdziału 11, który potem i tak wyzeruje ich wkład). Naiwne próbkowanie losuje z pełnego D(H), nieświadome G — część wylosowanych kierunków to więc próbki „z góry skazane" na wkład bliski zeru, ale i tak kosztujące pełny test przecięcia i ocenę BRDF.
VNDF (Heitz, 2018) próbkuje nie z D(H), tylko z rozkładu fasetek faktycznie widocznych z kierunku V — czyli D(H) przemnożone przez to, jaka część nich nie jest samo-zasłonięta:
VNDF jest droższe do policzenia per próbka (dodatkowa transformacja geometryczna: „ściśnij" kierunek widzenia przez roughness, próbkuj równomiernie na rzucie dysku, „rozciągnij" z powrotem) — ale ponieważ każda próbka faktycznie coś wnosi, tej samej jakości obrazu dochodzisz mniejszą liczbą próbek niż naiwnym D(H). To ten sam bilans koszt-per-próbka kontra liczba-potrzebnych-próbek, co przy sekwencjach niskiej dyskrepancji z Rozdziału 8 i przy denoiserze z Rozdziału 19 — droższy pojedynczy krok, tańszy cały render.
„GGX sampling" albo „VNDF sampling" jako nazwa techniczna raczej nie pojawia się bezpośrednio w interfejsie DCC — to szczegół implementacyjny silnika, nie parametr artysty. Widzisz jego efekt pośrednio: nowoczesne silniki (Arnold, Cycles, RenderMan) od kilku lat domyślnie używają VNDF, co jest jednym z powodów, dla których identyczna scena z identyczną liczbą próbek renderuje się dziś wyraźniej mniej szumiąco niż w silnikach sprzed ~2018 roku, bez żadnej zmiany ustawień ze strony artysty.
To zamyka cztery dodatki rozwijające temat BRDF od strony lookdev — od danych zmierzonych, przez warstwy, po to, jak silnik faktycznie losuje kierunki próbek. Razem z Rozdziałami 10–11 i Dodatkiem A masz teraz pełny obraz, od koncepcji po implementację.