C · kameraL · światłoD/S · diffuse/specularEXT OF · R.15, R.19
Dodatek AJ / Warstwa wyjścia

Light Path Expressions: jak zamówić konkretną warstwę

Rozdział 15 pokazał, że path tracer buduje ścieżki: kamera, odbicie, kolejne odbicie, światło. Rozdział 19 wspomniał o AOV-ach jako o gotowych buforach. Między jednym a drugim jest mechanizm, którego książka dotąd nie nazwała — sposób, w jaki mówisz rendererowi „daj mi osobno tylko to, co odbiło się od metalu po drugim odbiciu”.

TL;DR
Pass: Ścieżka jako słowo

Zapisz, co się działo po drodze

Weź ścieżkę z Rozdziału 15: promień wychodzi z kamery, trafia w ścianę i odbija się rozproszenie, potem trafia w drugą ścianę i znów rozprasza, wreszcie trafia w światło. Renderer wykonał trzy decyzje i każdą z nich zna. Zapisane literami:

C D D LC — start w kamerze (camera); D — rozproszenie (diffuse); L — koniec na źródle światła (light). Litery zapisywane są w kolejności, w jakiej zdarzenia zaszły — od kamery do światła

Alfabet jest krótki. Obok C i L są typy rozproszenia: D (diffuse), G (glossy, czyli rozmyte odbicie z Rozdziału 11) i S (specular, idealnie lustrzane z Rozdziału 7). Do tego kierunek zdarzenia: R (odbicie, reflection) albo T (przejście, transmission). Typ i kierunek zapisuje się razem w nawiasach ostrych, więc rozproszone odbicie to <RD>, a załamanie przez szkło to <TS>.

Path.as.wordta sama sciezka co w R.15
C <RD> <RD> L C <RD> <RD> L
Ta sama ścieżka, którą Rozdział 15 rysował jako geometrię, zapisana jako słowo. Każde odbicie dokłada jedną literę — nic ponad to, co renderer i tak musiał wiedzieć, żeby policzyć wkład.
Pass: Wyrażenie

Wzorzec, który wybiera podzbiór ścieżek

Skoro każda ścieżka jest słowem, to wybranie interesującej nas grupy jest dopasowaniem wzorca. LPE dokłada do alfabetu dwa operatory znane z wyrażeń regularnych: . (dowolne zdarzenie) i * (poprzedni element zero lub więcej razy).

C<RD>L   kontra   C<RD>.*LPierwsze pasuje wyłącznie do ścieżki kamera → jedno rozproszenie → światło, czyli diffuse bezpośredni. Drugie dopuszcza dowolny ciąg zdarzeń między pierwszym rozproszeniem a światłem, więc łapie cały diffuse — bezpośredni i pośredni razem

Różnica między tymi dwoma wyrażeniami to dokładnie różnica między AOV-em direct diffuse a diffuse. Pośredni dostajesz, odejmując jedno od drugiego — albo pisząc wzorzec, który wymaga co najmniej dwóch zdarzeń przed światłem.

Kilka wzorców, które warto rozpoznawać:

Typowe wyrażenia
  • C<RD>L — diffuse bezpośredni: jedno rozproszenie i od razu światło.
  • C<RS>L — odbicie lustrzane prosto ze źródła, czyli klasyczny highlight.
  • C<TS>.*L — wszystko, co przeszło przez powierzchnię: szkło, ciecze, transmisja z Rozdziału 7.
  • C.*L — wszystkie ścieżki, jakie istnieją. To jest beauty.

Ostatni wiersz jest tu najważniejszy. C.*L obejmuje każdą ścieżkę, więc jeśli zdefiniujesz zestaw AOV-ów, których wzorce są rozłączne i razem pokrywają C.*L, to ich suma jest matematycznie równa beauty — nie „mniej więcej”, tylko dokładnie. Renderer nie liczy ich osobno; liczy ścieżki raz i wrzuca wkład każdej do tego kubełka, do którego pasuje.

To wyjaśnia dwie rzeczy, które w compingu bywają zaskoczeniem. Po pierwsze: dodanie kolejnych AOV-ów prawie nie kosztuje czasu renderu, bo praca jest już wykonana — rośnie głównie zużycie pamięci i rozmiar pliku. Po drugie: jeśli warstwy nie sumują się do beauty, to znaczy, że zestaw wzorców czegoś nie pokrywa albo coś liczy dwa razy.

Pass: Light groups

Ten sam mechanizm, warunek na światło

Skoro wzorzec może wymagać konkretnego typu zdarzenia, może też wymagać konkretnego źródła na końcu ścieżki. Tak działają light groups: przypisujesz światłom etykiety, a renderer wystawia osobny bufor na każdą z nich.

Efekt jest taki, że po renderze możesz zmienić intensywność i barwę każdego światła osobno, w compingu, bez ponownego liczenia sceny — bo każde ma własną warstwę, a ich suma to znów beauty. Przy scenie z kilkunastoma światłami zamienia to iterację „popraw, wyrenderuj, obejrzyj” trwającą godziny w suwak działający natychmiast.

Ograniczenie warto znać: tak zrekonstruowana zmiana jest liniowa. Podkręcenie światła w compingu skaluje jego wkład, ale nie zmieni tego, co ono oświetla pośrednio w sposób nieliniowy — nie pojawi się nowy refleks tam, gdzie ścieżek nie było. Do dużych zmian nadal trzeba renderu.

Z praktyki

Składnia pochodzi ze specyfikacji Open Shading Language, więc jest zaskakująco zgodna między silnikami — Arnold, RenderMan i inne renderery oparte o OSL rozumieją te same wyrażenia. Standardowe AOV-y, które widzisz na liście (direct_diffuse, indirect_specular, transmission), to gotowe LPE, które ktoś już za Ciebie wpisał; w każdej chwili możesz dopisać własne.

Najczęstsze zastosowanie własnego LPE w lookdevie to izolacja jednego komponentu materiału po to, żeby zobaczyć, co właściwie robi — na przykład sam coat albo samo SSS z Dodatku AG, oddzielone od reszty. To szybsza diagnoza niż wyłączanie komponentów po kolei i renderowanie od nowa.

Słowniczek
LPE
Light Path Expression — wyrażenie regularne nad ciągiem zdarzeń na ścieżce światła.
C, L
Kamera i światło — początek i koniec ścieżki.
D, G, S
Typ rozproszenia: diffuse, glossy, specular.
R, T
Kierunek zdarzenia: odbicie albo przejście przez powierzchnię.
Light group
Etykieta na świetle dająca mu własny bufor; pozwala na relight w compingu.
Idź głębiej
Dodatek B — Importance sampling i MIS