Geometria, której nie ma w pliku sceny, może pochłonąć więcej pamięci niż cała reszta shota razem wzięta — i jedno pole trzeba wypełnić ręcznie, bo żaden preset go nie zgadnie.
disp_padding w Arnoldzie, displacement bound w RenderManie) nikt nie zgadnie za Ciebie, bo zależy od konkretnej mapy i jej gainu.Displacement przesuwa faktyczne wierzchołki siatki wzdłuż normalnej (albo w dowolnym kierunku, przy wektorowym displacement) na podstawie mapy wysokości, obliczane dopiero podczas dicingu/tesselacji w renderze — nie ma tej geometrii nigdzie w pliku sceny. W Arnoldzie steruje tym disp_map (podłączony shader/tekstura), disp_height (mnożnik skali) i mniej oczywisty, ale kluczowy disp_zero_value — wartość wejściowa traktowana jako „brak przesunięcia”. Mapa wysokości wyśrodkowana na szarości 0,5 (typowa dla detalu rzeźbionego, który ma zarówno wypychać, jak i wgniatać powierzchnię) potrzebuje disp_zero_value = 0,5; zostawiona na domyślnym zerze, cała mapa czyta się jako przesunięcie tylko w jedną stronę.
Osobny mechanizm, disp_autobump, zamienia wysokoczęstotliwościowy detal mapy na perturbację normalnych (bump) zamiast prawdziwej geometrii — pozwala uniknąć podkręcania subdiv_iterations tylko po to, żeby rozdzielić drobny detal, którego oko i tak nie odróżni od bumpa na sylwetce.
Ważna, łatwa do przeoczenia decoupling w Arnoldzie: disp_height (skala przesunięcia) nie zmienia bounding boxa obiektu w czasie renderu — robi to wyłącznie osobny parametr, disp_padding, rozszerzający bounding box o zadeklarowany margines. Za mały padding obcina displacement na krawędzi bounding boxa — detal znika albo zostaje ucięty tam, gdzie przesunięcie wykracza poza margines; za duży marnuje pamięć na strukturę przyspieszającą i spowalnia render bez żadnej korzyści.
RenderMan wymaga tego samego wprost jako atrybutu obiektu — Displacement Bound, promień (sferyczny margines), o jaki może się przesunąć dowolny punkt powierzchni. Domyślna wartość to zero, co w praktyce znaczy: displacement jest wyłączony/ucięty, dopóki nie ustawisz bound ręcznie — nawet z podłączonym, poprawnie działającym shaderem displacement.
To jest dokładnie pole, którego żaden preset nie zgadnie: właściwa wartość zależy od amplitudy konkretnej mapy pomnożonej przez gain shadera — tylko Ty (albo pomiar samej mapy) to wiesz. Zbyt mały margines po obu stronach silnika daje ten sam objaw: detal wygląda spłaszczony albo ucięty, mimo że sam shader displacement jest ustawiony poprawnie — pierwsze miejsce do sprawdzenia, zanim zaczniesz grzebać w mapie czy w gainie.
subdiv_type w Arnoldzie wybiera między catclark (Catmull-Clark, wygładza), linear (wstawia wierzchołki bez wygładzania — przydatne przy displacement na twardej powierzchni, gdzie wygładzanie bazowej siatki jest niepożądane) i none. Dokumentacja Arnolda podaje wprost fakt wart zapamiętania na pamięć: każda kolejna iteracja subdivision poczwórnia liczbę poligonów. Przejście z 2 na 3 iteracje nie dokłada 50% detalu — dokłada trzykrotność tego, co już było, licząc od bazowej siatki. Ten sam mechanizm dotyczy koncepcyjnie RenderMana — Catmull-Clark dzieli każdą fasetkę na cztery przy każdym kroku ku powierzchni granicznej, mimo że RenderMan nie wystawia artyście „liczby iteracji” jako osobnego suwaka (patrz niżej).
Arnold: subdiv_adaptive_error ustala maksymalne dopuszczalne odchylenie od prawdziwej powierzchni granicznej; subdiv_adaptive_metric wybiera, jak to odchylenie mierzyć (edge_length — długość krawędzi, flatness — odchylenie od płaskości, albo auto); subdiv_adaptive_space decyduje, czy błąd liczyć w przestrzeni rastra (piksele ekranu — gęściej blisko kamery i na sylwetkach, rzadziej daleko) czy w przestrzeni obiektu (stała gęstość niezależna od odległości od kamery — potrzebne przy instancjonowaniu, gdzie kopie tego samego obiektu leżą w różnych odległościach). Ustawienie subdiv_adaptive_error na zero wyłącza adaptacyjność i sprowadza subdivision z powrotem do stałej liczby iteracji.
RenderMan podchodzi do tego inaczej konceptualnie — nie ma parametru „liczba iteracji” wystawionego artyście w ogóle. Dicing (tesselacja) jest domyślnie adaptacyjny wprost do docelowego rozmiaru mikropoligonu w przestrzeni rastra (rzędu 1 piksela), z opcją przełączenia na tesselację w jednostkach świata zamiast pikseli ekranu (przydatne przy deformujących się symulacjach albo gdy kamera zooomuje/oddala się w trakcie ujęcia, żeby uniknąć zmiany gęstości siatki w połowie shota).
| Pojęcie | Arnold | RenderMan |
|---|---|---|
| Margines na displacement | disp_padding | Displacement Bound |
| Domyślna wartość marginesu | 0 — trzeba ustawić | 0 — displacement wyłączony/ucięty bez ustawienia |
| Sterowanie gęstością | subdiv_iterations + adaptive error | dicing do docelowego rozmiaru mikropoligonu (domyślnie ~1px) |
| Adaptacyjność | opcjonalna, jawnie włączana | domyślna, wbudowana w mechanizm dicingu |
Rozsądny punkt startowy na hero close-upach to niski, bezpieczny limit iteracji (żeby budżet pamięci nie eksplodował, gdyby coś poszło nie tak) plus ciasny próg adaptive error robiący faktyczną robotę — nie jedna wysoka, stała liczba iteracji zastosowana wszędzie. Ta kolejność priorytetów wynika wprost z mechanizmu opisanego wyżej: adaptive error dogęszcza dokładnie tam, gdzie trzeba (blisko kamery, na sylwetce), więc twardy limit iteracji jest tylko siatką bezpieczeństwa, nie głównym pokrętłem.
Materiały i geometria są gotowe. Rozdział 21 zamyka Część VI i otwiera ostatnią: HDRI i skalibrowane środowisko oświetleniowe, pod którym w ogóle da się cokolwiek ocenić.