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
Ośrodek rozpraszający (participating medium) pochłania i rozprasza światło wzdłuż całej drogi promienia, nie tylko w jednym punkcie trafienia.
Ray marching: krok po kroku wzdłuż promienia przez objętość, próbkując gęstość i akumulując transmitancję na każdym kroku.
Prawo Beera-Lamberta: transmitancja spada wykładniczo z odległością — ten sam wzór dla mgły, wody i szkła barwionego.
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
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
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
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
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
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.
Wolumetryczne rozpraszanie tuż pod nieprzezroczystą powierzchnią.
Co dalej
Cała fizyka światła w tej książce jest już kompletna. W następnym, ostatnim rozdziale tej części: denoising — jak wygładzić szum z Monte Carlo (Rozdział 15) bez czekania na tysiące próbek.