Dodatek AG w poprzedniej książce pokazał, czym jest random walk. Tu jest pytanie, które zadaje każdy artysta: jaki promień MFP wpisać, żeby wosk nie wyglądał jak plastik.
subsurface_radius (per kanał RGB) pomnożony przez osobny subsurface_scale; RenderMan jako diffuseMeanFreePath, skalowane globalnym unitLength sceny — to dwa różne miejsca schowania tego samego przelicznika jednostek.Dodatek AG w raytracing-book wyprowadza random walk fotonu pod powierzchnią od podstaw: współczynnik rozpraszania σ_s, współczynnik absorpcji σ_a i ich sumę, współczynnik ekstynkcji σ_t = σ_s + σ_a — im większy σ_t, tym gęstszy ośrodek i tym częściej foton zmienia kierunek. Odwrotność tej sumy to dokładnie ta wielkość, którą oba renderery wystawiają artyście jako suwak:
MFP jest zawsze podawany per kanał — R, G i B mają różne wartości, bo tkanka (czy dowolny inny ośrodek rozpraszający) pochłania poszczególne długości fali z różną siłą. W skórze hemoglobina i melanina pochłaniają zielone i niebieskie fotony znacznie szybciej niż czerwone, więc czerwone światło przenika głębiej i wraca dalej od punktu wejścia, zanim je zaabsorbuje ośrodek — to właśnie ten efekt widać jako czerwonawą poświatę na uszach czy palcach pod silnym podświetleniem (rim light). Skoro promień/MFP to bezpośrednio odwrotność σ_t, wyższa wartość zawsze oznacza mniej gęsty, bardziej przenikliwy ośrodek — niższa wartość gęstszy, bardziej nieprzezroczysty.
↓ raytracing-book, Dodatek AO — dlaczego hemoglobina i melanina akurat te długości fal pochłaniająaiStandardSurface (Rozdział 13) wystawia SSS jako osobną warstwę shadera, mieszaną z Lambertem, z sześcioma parametrami, które warto umieć czytać wprost jako wielkości fizyczne, a nie jako abstrakcyjne suwaki:
| Parametr | Znaczenie | Domyślnie |
|---|---|---|
subsurface | Waga: 0 = czysty Lambert, 1 = czysty SSS. | 0 |
subsurface_color | Albedo pojedynczego rozproszenia — barwa/jasność bazowa, osobna od promienia. | — |
subsurface_radius | MFP per kanał RGB — dystans, na jaki światło rozprasza się pod powierzchnią, zanim wróci na zewnątrz. | (1; 1; 1) |
subsurface_scale | Mnożnik promienia — tu jest schowana konwersja jednostek sceny na rzeczywiste centymetry/milimetry. | 1 |
subsurface_type | diffusion (tania aproksymacja dipolowa) / randomwalk (prawdziwy random walk, poprawny przy cienkiej geometrii i wklęsłościach) / randomwalk_v2 (dokładniejsza saturacja barwy dla obiektów mocno przezroczystych, kosztowniejszy). | randomwalk |
subsurface_anisotropy | Współczynnik Henyeya-Greensteina g (−1…1); działa tylko z randomwalk/randomwalk_v2. | 0 |
Parametry aiStandardSurface, gałąź Subsurface. Domyślny subsurface_type to randomwalk — dokładniejszy odpowiednik random walk z Dodatku AG, w przeciwieństwie do starszej aproksymacji dyfuzyjnej.
Kluczowy szczegół: subsurface_radius sam w sobie nie mówi nic o rzeczywistej odległości — to subsurface_scale decyduje, czym jest jedna jednostka promienia w danej scenie. Dokumentacja Arnolda podaje wprost: przy scenie zbudowanej w metrach, subsurface_scale = 0,01 sprawia, że liczby wpisane w subsurface_radius zaczynają oznaczać centymetry.
PxrSurface (i PxrLayerSurface, Rozdział 13) nazywa tę samą wielkość dosłownie: diffuseMeanFreePath (w skrócie dmfp) to kolor per kanał, podawany w milimetrach i skalowany globalną własnością unitLength sceny — jednym przelicznikiem dla całego shadera, zamiast osobnego mnożnika przy każdym parametrze.
| Parametr | Znaczenie | Jednostka / skalowanie |
|---|---|---|
diffuseMeanFreePath | Dosłowna średnia droga swobodna fotonu, per kanał RGB. | mm, skalowane przez unitLength sceny |
subsurfaceColor | Albedo pojedynczego rozproszenia — jasność bazowa, w parze z dmfp. | bezwymiarowe, 0–1 |
| model rozpraszania | Jensen Dipole / d'Eon Better Dipole / Burley Normalized (tanie aproksymacje) / Multiple Mean Free Paths / Path Traced (dokładny random walk, odpowiednik Arnoldowego randomwalk). | — |
Parametry PxrSurface, gałąź Subsurface. Model Path Traced jest kosztowniejszy i bardziej szumiący niż warianty dipolowe — dokładnie ten sam kompromis co Arnoldowy randomwalk kontra diffusion.
Zamiast zgadywać wartości dmfp, warto zacząć od zmierzonych danych referencyjnych — klasyczny zestaw z pracy Jensena i in. o transporcie światła podpowierzchniowego podaje albedo i dmfp dla kilku realnych materiałów:
| Materiał | Albedo (R · G · B) | dmfp mm (R · G · B) |
|---|---|---|
| Skóra (Skin1) | 0,436 · 0,227 · 0,131 | 3,67 · 1,37 · 0,68 |
| Mleko pełnotłuste | 0,908 · 0,881 · 0,759 | 10,90 · 6,58 · 2,51 |
| Marmur | 0,830 · 0,791 · 0,753 | 8,51 · 5,57 · 3,95 |
| Jabłko | 0,846 · 0,841 · 0,528 | 6,96 · 6,40 · 1,90 |
Zmierzone wartości referencyjne (Jensen i in., „A Practical Model for Subsurface Light Transport”). Punkt startowy do dalszego strojenia, nie gotowy wynik — geometria, oświetlenie i skala kamery zawsze wymagają korekty.
Zestawione obok siebie, oba systemy parametrów mówią dokładnie to samo — różnią się tylko tym, gdzie chowają konwersję jednostek sceny:
| Pojęcie | Arnold (aiStandardSurface) | RenderMan (PxrSurface) |
|---|---|---|
| MFP per kanał | subsurface_radius | diffuseMeanFreePath (dmfp) |
| Konwersja jednostek sceny | osobny mnożnik subsurface_scale | globalna własność unitLength |
| Albedo pojedynczego rozproszenia | subsurface_color | subsurfaceColor |
| Dokładny model transportu | subsurface_type = randomwalk | model Path Traced |
Ten sam artykuł Jensena i in., z tej samej mierzonej próbki skóry, nadaje się jako punkt startowy w obu silnikach — trzeba tylko wiedzieć, gdzie w każdym z nich wpisać przelicznik jednostek.
Najczęstszy błąd przy strojeniu SSS nie jest artystyczny — to pomyłka w jednostkach, ukryta za osobnym mnożnikiem (subsurface_scale) albo globalną własnością sceny (unitLength), o której łatwo zapomnieć, przenosząc wartości między silnikami albo między scenami w innej skali.
Odwrotny błąd daje odwrotny efekt: promień, który w rzeczywistości wychodzi dziesięć razy za mały (np. mikrony zamiast milimetrów), sprawia, że SSS praktycznie się wyłącza — powierzchnia przestaje przepuszczać jakiekolwiek światło pod sobą i wygląda płasko, matowo, jak pomalowany plastik, dokładnie odwrotnie niż wosk. Oba objawy to ten sam błąd o przeciwnym znaku: promień/MFP przestał odpowiadać realnej skali obiektu. Najbezpieczniejsza obrona to zawsze zacząć od zmierzonej wartości referencyjnej (jak tabela Jensena wyżej) i świadomie przeliczyć ją przez scale/unitLength danej sceny — nie od suwaka na oko.
subsurface_scale.unitLength sceny.subsurface_color w Arnoldzie, subsurfaceColor w RenderManie.Ten rozdział dał pojedynczy knob — promień/MFP jednej warstwy SSS. Rozdział 17 pokazuje, że skóra nigdy nie jest jedną warstwą: to stos kilku warstw rozpraszania o różnej głębokości, przykryty osobnym specularem, z detalami takimi jak pieprzyki i pory, które psują iluzję, jeśli są zbyt regularne.