TRAVERSAL · O(log n)BUILD/MEM · ~O(n log n)INSTANCE · shared mem, not shared workEXT OF · R.13,17,20
Dodatek I / Głębiej: Wydajność

Złożoność geometrii a obciążenie ray tracingu

„Ile trójkątów mogę sobie pozwolić?” to źle postawione pytanie. Ray tracing ma dwa zupełnie różne budżety kosztu geometrii — jeden rośnie zaskakująco wolno, drugi zaskakująco szybko. Ten dodatek rozdziela je.

TL;DR
Pass: Dwa budżety

Trawersowanie kontra budowa: różne tempo wzrostu

Rozdział 13 pokazał, że dobre BVH zamienia test O(n) na O(log n) na promień. To ma konkretną, policzalną konsekwencję: zwiększenie sceny z 1000 do 10 milionów trójkątów — 10 000 razy więcej geometrii — head głębokość drzewa z ~10 do ~23 poziomów. Nie 10 000 razy więcej pracy. Odczuwalnie więcej, ale nieproporcjonalnie mało.

Triangle.count.vs.BVH.depth10 000× vs 2,3×
LICZBA TRÓJKĄTÓW 1 tys. 10 tys. 100 tys. 1 mln 10 mln każdy krok = ×10 GŁĘBOKOŚĆ BVH (poziomy) ~10 ~13 ~17 ~20 ~23
Ta sama, dziesięciokrotna skala kroków na górze — słupki głębokości rosną łagodnie, nie wykładniczo.

To dobra wiadomość dla trawersowania. Zła wiadomość: budowa tego drzewa (Rozdział 13/Dodatek C) i jego rozmiar w pamięci rosną dużo szybciej — z grubsza liniowo do proporcjonalnie-do-n-log-n, nie logarytmicznie. Dla sceny animowanej, przebudowywanej co klatkę, to właśnie budowa, nie trawersowanie, zwykle najpierw uderza w limit czasu klatki.

Pass: Displacement

Tesselacja: geometria, która nie istnieje, aż jest potrzebna

Displacement i adaptacyjna subdywizja (Rozdział 4 rozszerzony) potrafią zamienić skromną siatkę kontrolną w miliardy mikro-trójkątów w momencie renderu — mapa wysokości nakładana na płaską płaszczyznę może wygenerować więcej geometrii niż cała reszta sceny razem wzięta. To właśnie ustawienia „dicing rate” / „subdivision iterations” w Arnoldzie i RenderManie kontrolują ten kompromis: więcej szczegółu kontra większe, droższe BVH.

Displacement.explosioncage → micropolygons
SIATKA KONTROLNA (kilka trójkątów) MIKRO-TRÓJKĄTY PO DISPLACEMENT
Ta sama powierzchnia — po prawej dosłownie tysiące razy więcej trójkątów, generowanych „w locie” przez silnik.
Pass: Instancing

Instancing: darmowa pamięć, niedarmowe promienie

Rozdział 17 pokazał, że instancing pozwala tysiącom kopii dzielić jedną siatkę i jedno BVH. To realnie oszczędza pamięć i czas budowy. Nie oszczędza jednak pracy trawersowania — każda widoczna instancja wciąż wymaga własnego testu ray-AABB (Rozdział 13) i, jeśli trafiona, własnego zejścia w dzielone BVH. Las z 10 000 identycznych drzew jest tani w pamięci, ale niekoniecznie tani w czasie renderu, jeśli promień musi sprawdzić większość z nich.

koszt_pamięci ≈ 1 × (siatka + BVH)
koszt_trawersowania ≈ N_widocznych_instancji × koszt_pojedynczego_testuN — liczba instancji, które promień faktycznie odwiedza; instancing nie zmienia tego czynnika
Z praktyki

Kiedy render zwalnia po dodaniu detalu, sprawdź, co faktycznie wzrosło: jeśli to czas „Building BVH” / „Updating Acceleration Structure” w logu renderu — to budowa, jednorazowy koszt na klatkę, poprawiany przez lepszy SAH albo cache’owanie BVH dla statycznej geometrii. Jeśli to czas samego renderu przy tej samej liczbie próbek — to prawdziwe trawersowanie, i warto sprawdzić, czy naprawdę tyle instancji jest widocznych, czy część można zredukować proxy/LOD-em pod GI.

Słowniczek
Koszt trawersowania
Praca na promień, rosnąca logarytmicznie z liczbą trójkątów.
Koszt budowy / pamięć BVH
Rośnie dużo szybciej niż trawersowanie — zwykle prawdziwy limit skali sceny.
Micropolygon displacement
Generowanie ogromnej liczby mikro-trójkątów z mapy wysokości w czasie renderu.
Instancing
Dzieli pamięć geometrii między kopiami; nie dzieli kosztu trawersowania.