MEDIUM · participatingMARCH · Δt stepsABSORB · Beer-LambertSSS · volume, tiny scale
Rozdział 18 / Zastosowania praktyczne

Wolumetria: mgła, dym i rozpraszanie podpowierzchniowe

Każdy materiał od Rozdziału 5 zatrzymywał promień na jednej, nieprzezroczystej powierzchni. Mgła, dym i skóra nie mają jednej powierzchni — światło podróżuje przez nie, gubiąc i zyskując energię na każdym kawałku drogi.

TL;DR
Pass: Problem

Kiedy promień nie zatrzymuje się na powierzchni

Rozdziały 4–11 zakładały, że promień trafia w nieprzezroczystą powierzchnię i tam się kończy (albo odbija/załamuje wzdłuż jednego kierunku, Rozdział 7). Mgła, dym, obłoki i chmury nie mają takiej powierzchni — to obszar wypełniony mikroskopijnymi cząstkami, z którymi światło może się zderzyć w każdym punkcie swojej drogi, nie tylko na granicy.

Surface.vs.volumesingle hit vs many events
POWIERZCHNIA (R.4–11) WOLUMEN (mgła, dym) koniec — jedno trafienie wiele zdarzeń wzdłuż drogi
Po lewej promień kończy podróż na jednej powierzchni. Po prawej — na każdym kroku przez mgłę coś może się zdarzyć.
Pass: Ray marching

Krok po kroku przez objętość

Ponieważ zdarzenia mogą wystąpić w każdym punkcie wolumenu, nie da się tego rozwiązać jednym testem przecięcia jak w Rozdziale 4. Ray marching dzieli odcinek promienia wewnątrz wolumenu na małe kroki Δt, próbkuje gęstość ośrodka w każdym z nich i akumuluje, ile światła przetrwało do tego miejsca.

Ray.marchingstep samples
Δt=50px · 9 kroków w wolumenie
transmitancja spada z każdym krokiem
Przesuń Δt — mniejszy krok daje więcej, gęściej rozstawionych próbek (dokładniej, drożej); większy krok mniej próbek (taniej, grubiej).

Tempo tego spadku opisuje prawo Beera-Lamberta — ten sam wzór, który tłumaczy, czemu głębsza woda jest ciemniejsza, a gęstsza mgła szybciej gubi widoczność:

T(d) = exp(−σ_t · d)T — transmitancja (jaka część światła przetrwała); σ_t — współczynnik ekstynkcji ośrodka; d — przebyta odległość
Beer-Lambertexponential decay
σ_t=0,70 · T spada do 0,5 przy d≈0,99
0 odległość d 0 1,0 T(d)
Przesuń σ_t — klasyczny wykładniczy spadek: dwa razy większe σ_t albo dwa razy większe d, ten sam kwadrat mniej światła.
Pass: Podpowierzchniowe

Ten sam ośrodek, tylko pod skórą

Rozpraszanie podpowierzchniowe (SSS) w skórze, wosku czy marmurze to dokładnie ten sam mechanizm — tylko w mikroskali, pod z pozoru nieprzezroczystą z zewnątrz powierzchnią. To właśnie ten proces opisał „diffuse” w Rozdziale 10 słowami; SSS po prostu symuluje go bezpośrednio, ray marchingiem albo dyfuzyjną aproksymacją, zamiast udawać go jednym wzorem Lamberta.

Różnica względem mgły jest wyłącznie w skali. Mgła ma średnią drogę swobodną rzędu metrów, więc widzisz jej wnętrze. Skóra ma ją rzędu milimetrów, więc z zewnątrz wygląda na nieprzezroczystą — ale w środku dzieje się dokładnie to samo błądzenie fotonu, które ray marching z poprzedniej sekcji śledził we mgle.

SSS.entry.exitwejście ≠ wyjście
materiał (skóra, wosk, marmur) wejście wielokrotne rozproszenie wyjście (przesunięte) przesunięcie
Punkt wejścia ≠ punkt wyjścia — światło wchodzi w jednym miejscu, rozprasza się wielokrotnie wewnątrz materiału i wychodzi kawałek dalej. To przesunięcie to cała różnica między zwykłym diffuse (Rozdział 10) a SSS.

Żeby to policzyć, trzeba rozbić współczynnik ekstynkcji na dwa składniki. We mgle wystarczało wiedzieć, ile światła ubywa z wiązki; pod powierzchnią ma znaczenie, czy ubyło, bo zostało pochłonięte, czy dlatego, że poleciało dalej w innym kierunku:

σ_t = σ_s + σ_aσ_s — współczynnik rozpraszania: światło zmienia kierunek, ale nadal niesie energię; σ_a — współczynnik absorpcji: energia zamienia się w ciepło i przepada. Ich suma to σ_t z prawa Beera-Lamberta z poprzedniej sekcji. Materiały SSS mają σ_s wielokrotnie większe od σ_a — dlatego światło potrafi w nich przebyć długą drogę, zanim zniknie
↓ Dodatek AG — SSS w praktyce lookdevu: dyfuzja kontra random walk, promień per kanał, pułapka skali
Z praktyki

Volume Shader w Blenderze, VDB w Houdinim, „Fog”/„Volumetric” w Unrealu — wszystkie sprowadzają się do ray marchingu przez pole gęstości (często zapisane właśnie jako VDB albo OpenVDB) i tego samego prawa Beera-Lamberta na transmitancję.

W Karmie i RenderManie ten sam wolumen wpina się przez USD jako osobny prym typu Volume wskazujący na pole VDB, a gęstość, kolor rozpraszania i anizotropia to po prostu parametry shadera wolumetrycznego. To dlatego chmura wyrenderowana w Houdinim i ta sama chmura wyrenderowana w Arnoldzie wyglądają podobnie mimo zupełnie innych silników — dane są te same, a fizyka z tego rozdziału jest jedna.

Słowniczek
Ośrodek rozpraszający (participating medium)
Materia rozpraszająca/pochłaniająca światło wzdłuż całej drogi promienia.
Ray marching
Krokowe próbkowanie promienia wewnątrz wolumenu.
Transmitancja
Ułamek światła, który przetrwał przejście przez ośrodek.
Prawo Beera-Lamberta
T(d) = exp(−σ_t·d) — wykładniczy zanik transmitancji.
Rozpraszanie podpowierzchniowe (SSS)
Wolumetryczne rozpraszanie tuż pod nieprzezroczystą powierzchnią.
Idź głębiej
Dodatek Z — Funkcja fazowa Henyeya-Greensteina Dodatek AG — Subsurface scattering