L_o = L_e + ∫ΩMETHOD · Monte CarloTERMINATE · Russian rouletteGI · ON
Rozdział 15 / Globalne oświetlenie

Path tracing i metody Monte Carlo

Rozdziały 1–11 rekurencyjnie śledziły jeden idealny promień odbicia i załamania na trafienie — dokładnie to, co opisał Whitted. Ten rozdział dodaje ostatni, brakujący kawałek: światło odbite od innych powierzchni, nie tylko wzdłuż jednego, idealnego kierunku.

TL;DR
Pass: Równanie

Równanie renderowania

James Kajiya sformalizował w 1986 roku jedno równanie, które opisuje absolutnie każdy efekt świetlny z tej książki:

L_o(p,ω_o) = L_e(p,ω_o) + ∫_Ω f(p,ω_i,ω_o) · L_i(p,ω_i) · (N·ω_i) dω_iL_o — światło wychodzące; L_e — światło emitowane (źródła); f — BRDF z Rozdziałów 10–11; L_i — światło przychodzące z kierunku ω_i; Ω — cała hemisfera nad punktem
↓ Dodatek U — czym właściwie jest dω, czyli kąt bryłowy ↓ Dodatek T — „L czego?”, czyli co mierzy radiancja

To równanie jest rekurencyjne: L_i w punkcie p, z kierunku ω_i, to po prostu L_o jakiejś innej powierzchni — tej, w którą trafia promień wysłany z p w kierunku ω_i. Diffuse i shadow rays z Rozdziału 6 to ta całka policzona tylko dla świateł punktowych (delta, bez integracji). Odbicia i załamania z Rozdziału 7 to ta całka policzona tylko wzdłuż jednego, idealnie zwierciadlanego kierunku. Czego wciąż brakuje: światła odbitego od innych rozproszonych powierzchni — czerwona ściana barwiąca sufit różowym blaskiem, klasyczne bounce light, które każdy widział na żywym renderze.

Rendering.equationrecursive hemisphere
hemisfera Ω P L_i(P,ω) = L_o(Q,…) Q …i tak dalej, rekurencyjnie
Każdy kierunek w hemisferze P prowadzi do jakiejś powierzchni Q, która ma własną hemisferę do policzenia.
Pass: Monte Carlo

Nie da się tego policzyć dokładnie

Całka po hemisferze nie ma zamkniętej formy dla realnej scenie. Metoda Monte Carlo szacuje każdą całkę, losowo próbkując punkty i uśredniając wynik. Zastosowana do jednego kierunku ω_i naraz:

L_o ≈ f(p,ω_i,ω_o) · L_i(p,ω_i) · (N·ω_i) / pdf(ω_i)jedna losowa próbka kierunku, odpowiednio zważona przez gęstość prawdopodobieństwa (pdf), z której ją wylosowano — importance sampling: próbkuj częściej kierunki, które i tak wnoszą więcej (np. proporcjonalnie do BRDF)
↓ Dodatek B — importance sampling i MIS, z dowodem

Uśrednienie wielu takich pojedynczych „ścieżek” na piksel zbiega do prawidłowej odpowiedzi — to dosłownie ten sam supersampling z Rozdziału 8, tylko teraz próbkujemy nie pozycję w pikselu, a całą ścieżkę światła przez scenę.

Path.averaging1 vs N paths
N=1 ścieżka · szum ∝ 1/√N ≈ 100%
TA SAMA SCENA, ROSNĄCA LICZBA LOSOWYCH ŚCIEŻEK
Przesuń N — jedna ścieżka to czysty szum, więcej ścieżek (każda coraz słabiej widoczna) sumuje się do gładkiego, prawidłowego wyniku. Szum spada jak 1/√N — żeby zmniejszyć go o połowę, potrzeba 4× więcej próbek.
Pass: Algorytm

Path tracing w praktyce

Konkretny algorytm (unidirectional path tracing, najprostszy i najczęstszy wariant): z kamery wysyłasz promień; w punkcie trafienia liczysz światło bezpośrednie promieniem cienia (Rozdział 6); potem — zamiast zawsze kontynuować rekurencję jak w Rozdziale 7 — losujesz, czy ścieżka przetrwa (ruletka rosyjska), żeby pozostać statystycznie nieobciążonym bez sztywnego limitu głębokości; jeśli przetrwa, próbkujesz nowy kierunek według BRDF (Rozdziały 10–11) i powtarzasz całość z nowego punktu trafienia, jak gdyby to była nowa kamera.

Path.tracer.loopper-sample algorithm
Promień zkamery (R.3) TrafienieBVH (R.13) Światłobezpośrednie (R.6) Ruletkarosyjska Próbkuj BRDF(R.10–11) nowy „promień pierwotny” z punktu trafienia
Ta sama pętla, którą Whitted opisał w 1980 — tylko kierunek odbicia jest teraz losowy, nie idealnie zwierciadlany.
Z praktyki

Przełącznik „GI” / „Global Illumination” i „Light Bounces” / „Max Bounces” w Arnoldzie, RenderManie, Cyclesie, V-Rayu czy trybie Path Tracer w Unrealu to dosłownie ten rozdział: GI włącza człon odbity równania renderowania, bounces ogranicza (statystycznie, przez ruletkę) długość ścieżki.

Nazwy suwaka są różne, mechanizm ten sam: Diffuse/Specular/Transmission Depth w Arnoldzie, Max Diffuse/Specular Bounces w Karmie (Houdini/Solaris), Trace Depth w RenderManie. Wszędzie chodzi o to samo — po ilu odbiciach urwać rekurencję z tego rozdziału. Osobne limity dla diffuse i specular istnieją, bo to pierwsze zbiega się szybko i rzadko potrzebuje więcej niż 2–3 odbić, a drugie potrafi wymagać kilkunastu, zanim szkło przestanie być czarne.

Szum kontra czas renderu, z którym walczysz w każdym projekcie, to nieunikniona konsekwencja Monte Carlo — nie ma darmowego obiadu, są tylko lepsze sposoby próbkowania (next-event estimation, bidirectional path tracing, ReSTIR) i denoisery, które wygładzają wynik przy tej samej liczbie próbek.

Słowniczek
Równanie renderowania
L_o = L_e + ∫_Ω f·L_i·(N·ω_i) dω_i.
Radiancja (L)
Miara ilości światła; L_o wychodząca, L_i przychodząca, L_e emitowana.
Metoda Monte Carlo
Szacowanie całki przez losowe próbkowanie i uśrednianie.
Importance sampling
Próbkowanie częściej tam, gdzie wkład do wyniku jest większy.
Ruletka rosyjska
Losowe, nieobciążone zatrzymywanie ścieżki, zamiast sztywnego limitu głębokości.
Path tracing
Algorytm Monte Carlo śledzący losowe ścieżki światła przez scenę.
Global Illumination (GI)
Światło odbite od innych powierzchni, nie tylko bezpośrednie.
Idź głębiej
Dodatek B — Importance sampling, MIS (z dowodem) Dodatek U — Kąt bryłowy i geometria sferyczna Dodatek W — Transformacja między rozkładami Dodatek Y — Environment lighting / HDRI Dodatek AE — Ambient Occlusion Dodatek AJ — Light Path Expressions i AOV Dodatek AN — MLT, ReSTIR i rekonstrukcja neuronowa