GRAPH · re-eval per hitCOST · texture ≠ mathLAYERS · multiplicativeEXT OF · R.9,11,14
Dodatek J / Głębiej: Wydajność

Złożoność sieci shaderów a obciążenie renderowania

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.

TL;DR
Pass: Re-ewaluacja

Graf liczy się od nowa w każdym trafieniu

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.

Shading.graph.DAGre-evaluated per hit
Tekstura: Albedo Tekstura: Roughness Szum proceduralny Mix BRDF (R.10–11) ten sam graf — od nowa, dla każdego z milionów trafień
Żaden węzeł nie „pamięta” wyniku z poprzedniego punktu — każde trafienie zaczyna graf od liści.
Pass: Tekstura kontra matematyka

Dwa różne rodzaje kosztu

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.

Pass: Warstwy

Warstwy materiału mnożą koszt, nie dodają

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.

Layered.material.cost3× full BRDF, not 1×+ε
warstwa: clearcoat — D·G·F warstwa: mid-coat — D·G·F warstwa: baza — D·G·F ≈3× koszt jednej BRDF
Każda warstwa to własny komplet D, G i F — koszt się mnoży wraz z liczbą warstw.
Pass: GPU

Rozbieżność w grafach materiałów

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.

Warp.divergence.material.graphsame problem, inside one graph
WARP: 8 PROMIENI, JEDEN GRAF, DWIE GAŁĘZIE MIX PASS 1 · gałąź „metal” PASS 2 · gałąź „lakier”
To dosłownie diagram z Rozdziału 14 — tylko podział na gałęzie nie wynika z różnych materiałów, a z jednej maski wewnątrz jednego grafu.
Z praktyki

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.

Słowniczek
Re-ewaluacja per-hit
Graf materiału liczy się od zera dla każdego punktu trafienia.
Koszt pamięci kontra ALU
Odczyt tekstury (pamięć) i matematyka proceduralna (obliczenia) to różne rodzaje kosztu.
Koszt multiplikatywny warstw
Każda warstwa materiału to osobna, pełna ewaluacja BRDF.
Rozbieżność wewnątrz grafu
Różne gałęzie jednego materiału powodują ten sam koszt co różne materiały w warpie.
Ubershader
Jeden uniwersalny shader z gałęziami warunkowymi dla wszystkich wariantów materiału.

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.

Koniec dodatków (na razie)