SCENE · N trianglesSTRUCT · BVHCOST · O(log n)TEST · AABB slab
Rozdział 13 / Wydajność

Struktury akceleracyjne: BVH

Testowanie promienia przeciw każdemu trójkątowi ze sceny liczącej miliony trójkątów byłoby katastrofalnie wolne. BVH sprawia, że sprawdzasz dziesiątki, nie miliony — bez zmiany ani jednego wzoru z Rozdziału 4.

TL;DR
Pass: Problem

Dlaczego testowanie wszystkiego nie skaluje się

Każdy promień pierwotny (Rozdział 3), cienia (Rozdział 6), odbity i załamany (Rozdział 7) potrzebuje testu przecięcia ze sceną (Rozdział 4). Naiwne podejście: sprawdź promień przeciw każdemu trójkątowi po kolei. Dla siatki z milionami trójkątów, przy wielu promieniach na piksel (Rozdział 8) i głębokości rekurencji z Rozdziału 7 — liczba testów eksploduje, mimo że promień naprawdę trafia w jeden, może dwa trójkąty.

Brute.force12 tested, 1 hit
TRAFIONE
Fioletowa poświata = przetestowane. 12 niepotrzebnych testów na 1 prawdziwe trafienie — a to tylko 13 trójkątów.
Pass: Idea

Pudełka wokół grup obiektów

Prosty test ray-AABB (axis-aligned bounding box — pudełko o ścianach równoległych do osi) jest dużo tańszy niż test ray-trójkąt. Kluczowa obserwacja: jeśli promień mija pudełko, gwarantowane jest, że mija wszystko wewnątrz niego — możesz odrzucić całą grupę za darmo, bez sprawdzania ani jednego trójkąta w środku.

BVH (Bounding Volume Hierarchy) zagnieżdża takie pudełka w drzewo: korzeń obejmuje całą scenę, każdy poziom dzieli się na mniejsze pudełka, aż liście zawierają już tylko kilka trójkątów. Trawersowanie: testuj pudełko; jeśli trafione, zejdź do dzieci; jeśli nie — od razu odetnij całe poddrzewo.

BVH.treespace ↔ graph
x=270 · promień w R
PUDEŁKA W PRZESTRZENI DRZEWO BVH ROOT L (odrzucone) R (testowane) ROOT L R odcięte za darmo sprawdzone pojedynczo
Przesuń pozycję promienia — ten sam podział widziany dwa razy: jako pudełka w scenie i jako drzewo. Gałąź, której promień nie dotyka, nigdy nie jest odwiedzana.
Pass: Slab test

Ray-AABB: test przecięcia z pudełkiem

Pudełko to przecięcie trzech „plasterków” (slabs) — po jednym na każdą oś. Dla każdej osi liczysz t, przy którym promień wchodzi i wychodzi z plasterka, tym samym wzorem promienia P(t)=O+tD z Rozdziału 2. Promień trafia w pudełko, jeśli przedziały t z wszystkich osi się przecinają:

t1 = (box_min − O) / D, t2 = (box_max − O) / D
t_near = max(min(t1,t2) po osiach), t_far = min(max(t1,t2) po osiach)trafienie ⇔ t_near ≤ t_far (i t_far ≥ 0); dzielenie po współrzędnych, oś po osi
Slab.test.2Dx-slab ∩ y-slab
θ=25° · t_near≈312 (x-slab) → t_far≈533 (x-slab)
t_near t_far y-slab y-slab
Przesuń θ — pogrubiony odcinek to prawdziwe przecięcie z pudełkiem, liczone dokładnie wzorem t_near/t_far z formuły wyżej.
Z praktyki

Budowa dobrego BVH — gdzie dzielić każdy węzeł — to osobne zagadnienie. Produkcyjne renderery używają SAH (Surface Area Heuristic): szacują koszt trawersowania dla różnych podziałów i wybierają ten, który minimalizuje oczekiwaną liczbę testów, zamiast dzielić po prostu na pół.

↓ Dodatek C — jak dokładnie działa SAH

To dlatego animowana, deformująca się geometria (postacie ze szkieletem, symulacje tkaniny) jest droższa w ray tracingu niż statyczna: BVH trzeba przebudować albo dopasować (refit) co klatkę. Sprzętowy ray tracing (RTX, wspomniany w Rozdziale 1) to w dużej mierze dedykowany układ do właśnie tego trawersowania.

Słowniczek
BVH (Bounding Volume Hierarchy)
Drzewo zagnieżdżonych pudełek otaczających grupy obiektów.
AABB
Pudełko o ścianach równoległych do osi układu współrzędnych.
Slab test
Test ray-AABB przez przecięcie przedziałów t na każdej osi.
Trawersowanie (traversal)
Przechodzenie drzewa BVH od korzenia do liści.
Przycinanie (pruning)
Odrzucanie całego poddrzewa bez sprawdzania jego zawartości.
SAH (Surface Area Heuristic)
Heurystyka wyboru podziału minimalizująca oczekiwany koszt trawersowania.
Idź głębiej
Dodatek C — Budowa BVH: SAH Dodatek I — Złożoność geometrii a obciążenie