Dodatek I rozłożył koszt geometrii. Ten robi to samo dla drugiej strony równania: sieci node’ów, którą budujesz w Substance, Blenderze czy Unrealu, i którą renderer musi policzyć w każdym pojedynczym punkcie trafienia.
Węzeł w grafie materiału nie ma pamięci między wywołaniami. Każdy z milionów punktów trafienia w scenie (z każdą próbką AA z Rozdziału 8, każdym odbiciem z Rozdziału 7, każdą ścieżką GI z Rozdziału 15) ma inne UV, inną normalną, inny kąt widzenia — więc cały graf, od odczytów tekstur po finalne złożenie BRDF, liczy się od zera, dla każdego z nich.
Odczyt tekstury (Rozdział 9) to dostęp do pamięci — potencjalny cache miss, tym bardziej prawdopodobny, gdy materiał ma wiele unikalnych map 4K/8K naraz. Matematyka proceduralna (szum, funkcje, mix) to czysty koszt obliczeń — deterministyczny, bez odwołań do pamięci, ale rosnący z liczbą oktaw czy iteracji. Graf z dwudziestoma odczytami tekstur może być w praktyce wolniejszy albo szybszy niż graf z pięcioma odczytami i ciężką matematyką proceduralną — zależy od zachowania cache’u, nie od liczby node’ów widocznych w edytorze.
Clearcoat z Dodatku A to nie mały dopłat do kosztu — to druga, kompletna ewaluacja D·G·F (Rozdział 11), z własnym Fresnelem. Materiał z bazą, mid-coatem i clearcoatem liczy z grubsza trzy pełne BRDF, nie jeden plus dwa drobne dodatki.
Rozdział 14 pokazał, że warp GPU trafiający w różne materiały (diffuse kontra szkło) musi wykonać oba fragmenty kodu sekwencyjnie. Ten sam problem pojawia się wewnątrz jednego, złożonego grafu: jeśli maska w node’ie Mix wybiera różne gałęzie dla różnych promieni w tym samym warpie — jedne trafiają w gałąź „metal”, inne w gałąź „lakier” tego samego materiału — GPU i tak serializuje obie ścieżki. Rozbudowany graf z wieloma warunkowymi gałęziami jest nieproporcjonalnie droższy na GPU niż na CPU, z dokładnie tego samego powodu co w Rozdziale 14.
Renderery radzą sobie z tym dwiema strategiami: kompilacja wyspecjalizowanego kodu na materiał (Arnold-style — dłuższe przygotowanie, szybsze liczenie) albo jeden uniwersalny „ubershader” z wieloma gałęziami warunkowymi (prostszy pipeline, więcej kosztu rozbieżności w runtime). Praktyczna heurystyka złożoności grafu: licz odczyty tekstur i liczbę warstw BRDF, nie liczbę node’ów widocznych w edytorze — dwa node’y matematyczne kosztują dużo mniej niż jeden odczyt tekstury 8K, a jedna dodatkowa warstwa clearcoat kosztuje więcej niż dziesięć node’ów Mix.
Dodatki I i J domykają parę: geometria, którą promień trafia, i sieć, którą musi policzyć po trafieniu. Razem to właściwie kompletny obraz tego, gdzie naprawdę idzie czas renderu.