Rozdział 10 nazwał diffuse „światłem, które wniknęło pod powierzchnię i wyszło w losowym kierunku” — i od razu założył, że wyszło w tym samym punkcie. Dla betonu to prawda z dokładnością do mikrometrów. Dla skóry, wosku, marmuru i mleka to założenie jest fałszywe i widać to gołym okiem. Ten dodatek pokazuje, co dokładnie się psuje, jak renderer to naprawia i którym pokrętłem naprawdę sterujesz.
BRDF z Rozdziałów 10–11 to funkcja f(p, ω_i, ω_o): jeden punkt p, kierunek wejścia, kierunek wyjścia. Cztery wymiary, bo każdy kierunek to dwa kąty. Cała jej konstrukcja opiera się na założeniu, że światło wchodzi i wychodzi w tym samym miejscu.
SSS łamie dokładnie to założenie, więc potrzebuje funkcji o dwóch punktach — S(x_i, ω_i; x_o, ω_o), zwanej BSSRDF. Osiem wymiarów zamiast czterech: dwa punkty na powierzchni po dwie współrzędne i dwa kierunki po dwa kąty.
Ta dodatkowa całka po powierzchni jest całym kosztem i całym efektem. To ona sprawia, że ucho podświetlone od tyłu świeci na czerwono, a nos w zbliżeniu ma miękkie, „mięsiste” przejście do cienia zamiast twardej krawędzi Lamberta.
Kiedy można to zignorować. Jeśli typowe przesunięcie między wejściem a wyjściem jest wyraźnie mniejsze niż piksel, całka po A zbiega się do jednego punktu i BSSRDF staje się BRDF — nie przez przybliżenie, tylko dokładnie. Dlatego ta sama postać w szerokim planie nie potrzebuje SSS, a w zbliżeniu na twarz potrzebuje go rozpaczliwie. To nie jest kwestia „jakości ustawień”, tylko relacji między promieniem rozpraszania a wielkością piksela w tym konkretnym ujęciu.
Rozdział 18 wprowadził σ_t jako jeden współczynnik ekstynkcji w prawie Beera-Lamberta. Pod powierzchnią trzeba go rozbić, bo światło ginie z wiązki na dwa zupełnie różne sposoby: albo zostaje pochłonięte (zamienione w ciepło, przepada), albo rozproszone (leci dalej, tylko w innym kierunku).
Do kompletu dochodzi czwarta wielkość, którą znasz już z Rozdziału 18: anizotropia g funkcji fazowej. Tkanki biologiczne rozpraszają silnie do przodu (g rzędu 0,7–0,9), a nie równomiernie — foton po rozproszeniu leci mniej więcej tam, gdzie leciał.
↓ Dodatek Z — funkcja fazowa Henyeya-Greensteina i parametr gMając te współczynniki, renderer może pójść dwiema drogami. Różnica między nimi to najważniejszy przełącznik w całym shaderze SSS.
Aproksymacja dyfuzyjna. Skoro α ≈ 1 i rozproszeń są setki, to statystycznie światło zachowuje się jak dyfuzja — rozlewa się od punktu wejścia według gładkiego profilu, którym można opisać całą chmurę ścieżek jednym wzorem. Renderer nie śledzi niczego pod powierzchnią; oświetla powierzchnię, a potem rozmywa to oświetlenie profilem R(r) zależnym wyłącznie od odległości między punktami.
Random walk. Renderer po prostu robi to, co Rozdział 18 robił we mgle: załamuje promień do wnętrza, losuje dystans do następnego zdarzenia z rozkładu wykładniczego, rozprasza kierunek funkcją fazową, powtarza — aż foton zostanie pochłonięty albo wyjdzie przez powierzchnię. Żadnego profilu, żadnego założenia. Ta sama pętla co w wolumetrii, tylko w skali milimetrów.
Gdzie dyfuzja się rozpada. Jej wyprowadzenie zakłada, że foton ma miejsce na wiele rozproszeń, zanim trafi na powierzchnię. W uchu, płetwie, płatku kwiatu albo skrzydle owada geometria jest cieńsza niż kilka średnich dróg swobodnych — foton wychodzi po dwóch, trzech zdarzeniach. Model dyfuzyjny tego nie przewiduje: cienkie miejsca wychodzą za ciemne i za mało prześwitujące, bo profil zakłada materiał półnieskończony i nie ma pojęcia, że po drugiej stronie jest powietrze. Random walk trafia to poprawnie bez żadnego dodatkowego ustawienia, bo po prostu widzi, że promień wyszedł drugą stroną.
To jest powód, dla którego produkcja przeszła na random walk mimo wyższego kosztu — nie dlatego, że dyfuzja jest „niedokładna” w ogólności, tylko dlatego, że zawodzi dokładnie tam, gdzie patrzy widz: na uszach i nosie w kontrze.
1. Promień per kanał RGB. To nie jest „kolor SSS” w sensie barwnika — to trzy różne odległości. Czerwone światło wnika w tkankę znacznie głębiej niż niebieskie, bo hemoglobina i melanina pochłaniają krótkie fale dużo silniej. Stąd charakterystyczna czerwona poświata na krawędziach: w miejscu, gdzie zieleń i błękit już dawno zostały pochłonięte, czerwień wciąż ma dość energii, żeby wyjść.
2. Skala. Tu ginie najwięcej czasu. Promień jest wyrażony w jednostkach sceny. Ta sama wartość 1,0 znaczy „jeden centymetr” w scenie modelowanej w centymetrach i „jeden metr” w scenie modelowanej w metrach — czyli sto razy więcej rozlania. Postać zaimportowana z innego pipeline'u albo przeskalowana węzłem transformacji potrafi z dnia na dzień zmienić się z realistycznej skóry w półprzezroczysty wosk, przy nietkniętym shaderze.
Dlatego shadery rozdzielają zwykle promień (proporcje między kanałami, czyli charakter materiału) od skali (jeden mnożnik dopasowujący całość do jednostek sceny). Charakter skóry stroisz proporcją kanałów; dopasowanie do modelu — mnożnikiem.
3. Współczynnik załamania (IOR). Steruje dwiema rzeczami naraz: siłą odbicia lustrzanego na powierzchni, przez Fresnela z Rozdziału 7, oraz — w random walku — załamaniem promienia przy wejściu do ośrodka. Dla tkanek to okolice 1,33–1,4. Podniesienie IOR rozjaśnia specular i jednocześnie zmienia rozkład światła w środku, więc nie jest to pokrętło „tylko od połysku”.
4. Anizotropia g. Domyślne zero (rozpraszanie izotropowe) jest wygodne, bo pozwala renderowi używać krótszych ścieżek, ale tkanki rozpraszają do przodu. Dodatnie g sprawia, że światło wnika głębiej przy tej samej wartości σ_s — efekt bywa mylony ze zwiększeniem promienia.
W Arnoldzie to grupa Subsurface w standard_surface: subsurface (waga), subsurface_color, subsurface_radius (trzy kanały), subsurface_scale (mnożnik do jednostek sceny), subsurface_anisotropy oraz przełącznik subsurface_type — randomwalk kontra starsza diffusion. RenderMan wystawia kilka modeli w PxrSurface, w tym ścieżkę path-traced odpowiadającą random walkowi. Karma i inne silniki oparte o MaterialX robią to przez subsurface w MaterialX Standard Surface — czyli ten sam model, który Rozdział 11 opisał jako standard.
Kolejność strojenia, która oszczędza najwięcej czasu: najpierw sprawdź jednostki sceny i ustaw skalę, potem proporcje kanałów, dopiero na końcu wagę i kolor. Odwrotna kolejność kończy się kompensowaniem błędu skali kolorem — i shaderem, który rozjeżdża się przy pierwszym ujęciu z inną kamerą.
Jeśli SSS zaszumia się bardziej niż reszta obrazu, to zwykle random walk na materiale o α bardzo blisko 1: fotony wykonują setki odbić, zanim wyjdą. Renderery mają na to osobne limity kroków i to je podnosi się w pierwszej kolejności, a nie globalną liczbę próbek z Rozdziału 8.
SSS to jeden z trzech tematów, które w produkcji dotykasz codziennie, a które w głównym nurcie książki były tylko wspomniane. Dodatek AH bierze następny: displacement i subdivision liczone w czasie renderu.