OSL · domknięciaMaterialX · graf≠ shader pikseliEXT OF · R.10, R.11
Dodatek AI / Lookdev w praktyce

MaterialX i OSL: w czym dziś opisuje się materiały

Rozdziały 10 i 11 podały model materiału jako wzory. W produkcji nikt nie wpisuje tych wzorów ręcznie — buduje graf węzłów, który potem musi zadziałać w Arnoldzie, w Karmie, w podglądzie w Houdinim i w przeglądarce USD, dając ten sam wynik. Ten dodatek wyjaśnia, jak to w ogóle możliwe, że jeden opis materiału działa w kilku silnikach naraz.

TL;DR
Pass: Domknięcia

Dlaczego shader nie zwraca koloru

W rasteryzacji shader fragmentu dostaje wszystkie dane wejściowe naraz i zwraca gotowy kolor. W ray tracerze to nie zadziała — i powód jest ten sam, który przewijał się przez cały Rozdział 15.

Żeby policzyć kolor, trzeba znać L_i, czyli światło przychodzące. Żeby je poznać, trzeba wystrzelić promienie. Żeby wiedzieć, gdzie je wystrzelić, trzeba znać BRDF — bo importance sampling z Dodatku B losuje kierunki proporcjonalnie do niej. Ale BRDF jest wynikiem działania shadera. Shader musiałby więc zwrócić kolor, żeby renderer mógł mu dostarczyć dane, których shader potrzebuje, żeby zwrócić kolor.

Wyjście z tego błędnego koła nazywa się domknięciem. Shader nie liczy koloru — opisuje BRDF i oddaje ten opis rendererowi:

shader → closure(typ, parametry)   zamiast   shader → RGBtyp — która rodzina BRDF, np. mikrofasetkowa GGX z Rozdziału 11 albo Lambert z Rozdziału 5; parametry — konkretne wartości dla tego punktu: roughness, F0, kolor, IOR. Renderer dostaje przepis, nie wynik, więc może go próbkować tak, jak akurat mu wygodnie
Closure.vs.colorkto decyduje o probkowaniu
SHADER ZWRACA KOLOR SHADER ZWRACA DOMKNIĘCIE shader potrzebuje L_i żeby poznać L_i, trzeba znać BRDF — czyli wynik shadera błędne koło shader closure: GGX, α=0,3 renderer próbkuje sam shader nigdy nie widzi światła
Rozdzielenie ról: shader mówi czym jest powierzchnia, renderer decyduje jak ją policzyć. Dzięki temu ten sam shader działa w path tracerze, w BDPT z Rozdziału 16 i w podglądzie czasu rzeczywistego — każdy próbkuje po swojemu.

To rozdzielenie ma jeszcze jedną konsekwencję, którą widać w praktyce: shader nie może „podejrzeć” światła i zareagować na nie warunkiem. Próba napisania materiału, który zachowuje się inaczej w cieniu niż w świetle, rozbija się właśnie o tę granicę — i to jest cecha, nie ograniczenie implementacji.

Pass: OSL

Język, w którym się je pisze

Open Shading Language powstał w Sony Imageworks właśnie po to, żeby pisać domknięcia. Składniowo przypomina C, ale zwraca nie kolor, tylko wyrażenie budowane z wbudowanych domknięć — diffuse, microfacet, emission i kilkunastu innych — które można ze sobą mieszać i ważyć.

Dla artysty technicznego istotne są trzy konsekwencje. Po pierwsze, OSL kompiluje się raz i działa w każdym rendererze, który go obsługuje. Po drugie, węzły w edytorze materiałów to najczęściej właśnie shadery OSL — graf, który klikasz, jest kompilowany do jednego programu. Po trzecie, koszt: rozbudowana sieć węzłów to realny czas liczony przy każdym trafieniu promienia, a nie raz na obiekt.

↓ Dodatek J — ile faktycznie kosztuje sieć shaderów
Pass: MaterialX

Format, który przenosi materiał między programami

OSL rozwiązuje problem „jak opisać materiał”, ale nie „jak przenieść go z Mayi do Houdiniego bez przepisywania”. Tym zajmuje się MaterialX: to opis grafu węzłów wraz z definicjami, co każdy węzeł znaczy — niezależny od konkretnej aplikacji.

Najważniejszy element z punktu widzenia tej książki to MaterialX Standard Surface: uzgodniony, spisany model powierzchni, którego wejścia to dokładnie parametry z Rozdziału 11 i Dodatku AG — base, specular roughness, metalness, IOR, transmission, subsurface, coat. To nie jest „jeszcze jeden shader”, tylko wspólny mianownik, do którego kilku producentów silników się zobowiązało.

MaterialX.interchangejeden graf, wiele silnikow
MaterialX Standard Surface Arnold Karma RenderMan podgląd USD inne silniki ten sam graf, ten sam model z Rozdziału 11
MaterialX nie jest silnikiem — jest umową. Każdy renderer implementuje ten sam model po swojemu, ale wejścia i ich znaczenie są wspólne, więc materiał przenosi się bez tłumaczenia węzeł po węźle.

W praktyce oznacza to, że kolumna parametrów, którą stroisz w lookdevie, jest dziś w dużej mierze ta sama niezależnie od silnika — a różnice, na które trafiasz, są różnicami implementacji tego samego modelu, nie różnicami modelu.

Z praktyki

Karma używa MaterialX natywnie — graf, który budujesz w Solarisie, jest grafem MaterialX, a nie tłumaczeniem na niego. Arnold i RenderMan obsługują zarówno własne węzły, jak i MaterialX; standard_surface Arnolda i MaterialX Standard Surface to celowo ten sam model o tych samych nazwach wejść. OSL działa w Arnoldzie, RenderManie i Cyclesie.

Praktyczna konsekwencja przy przenoszeniu materiału: rozjazd wyglądu między silnikami przy identycznych wartościach wynika prawie zawsze z rzeczy obok modelu — innej przestrzeni kolorów tekstury (Dodatek E), innych jednostek sceny przy SSS (Dodatek AG) albo innego domyślnego filtra tekstur (Dodatek G) — a nie z samej BRDF.

Słowniczek
Domknięcie (closure)
Opis BRDF zwracany przez shader zamiast koloru; renderer sam decyduje, jak go próbkować.
OSL
Open Shading Language — język do pisania shaderów zwracających domknięcia.
MaterialX
Otwarty format opisu grafu materiału, przenośny między aplikacjami i silnikami.
MaterialX Standard Surface
Uzgodniony model powierzchni; jego wejścia to parametry z Rozdziału 11 i Dodatku AG.
Idź głębiej
Dodatek J — Złożoność sieci shaderów Dodatek A — Warianty materiałów PBR