Wszystkie artykuły
Tutoriale · 6 min read

Gęste lasy bez klifu framerate: LOD-y, impostory i instancing

Jak renderować tysiące drzew przy framerate, łańcuch LOD od pełnego mesha do billboardu, oktaedryczne impostory trzymające pod każdym kątem, instancing i culling, oraz sztuczki wiatru i cieniowania utrzymujące zapieczony las przed wyglądem martwym.

Spruce forest on a green alpine slope with a handful of wooden cabins below

W skrócie: przekonujący gęsty las to walka z bossem wydajności, tysiące wielopoligonowych drzew, warstwowa przezroczystość i instancje sięgające horyzontu. Wygrywasz go dyscyplinowanym łańcuchem LOD kończącym się impostorami (billboardy zwrócone do kamery udające drzewo 3D z każdego kąta), agresywnym instancingiem i cullingiem, oraz paroma sztuczkami cieniowania, by tanie odległe drzewa się nie zdradziły. Ten artykuł prowadzi przez cały łańcuch od pełnego mesha do billboardu, sztuczkę oktaedrycznego impostora, oraz jak zapobiec temu, by mocno zoptymalizowany las wyglądał martwy.

Skraj lasu, drzewa cofające się w głąb Każde drzewo tutaj jest w innej odległości od kamery, więc każde drzewo powinno mieć inny koszt. Sztuka taniego lasu polega na wydawaniu poligonów tylko na bliskich i przekonującym udawaniu reszty.

Główna idea: płacić za odległość

Drzewo 5 metrów dalej i 500 metrów dalej nie powinny kosztować tyle samo. Łańcuch LOD wydaje pełny detal blisko i progresywnie tańsze reprezentacje z odległością, kończąc płaskim billboardem, więc całkowity koszt pozostaje płaski, gdy las rośnie.

Cała gra polega na odmowie płacenia pełnej ceny za drzewa, które kamera ledwo rozdziela. Blisko drzewo to pełny mesh z indywidualnymi kartami liści; daleko to garść pikseli, które płaski obraz odtwarza doskonale. Łańcuch LOD (level-of-detail) to formalizuje: kilka wersji tego samego drzewa o malejącym koszcie, wymienianych według wielkości na ekranie, więc las dziesięciu tysięcy drzew kosztuje mniej więcej to, co widoczne w detalu, zamiast sumy każdego drzewa w pełnej jakości. Bez niego gęstość skaluje twój czas klatki liniowo w ziemię; z nim możesz popchnąć liczbę drzew znacznie wyżej za ten sam budżet.

Łańcuch LOD, krok po kroku

LOD0 pełny mesh z kartami liści (blisko); LOD1–2 zredukowana geometria i uproszczone liście (średnio); LOD3 kilka kart lub pojedyncza karta; ostatni LOD impostor/billboard (daleko). Każdy krok mniej więcej połowi koszt, gdy zamiana pozostaje niewidzialna.

Typowy łańcuch LOD listowia biegnie mniej więcej tak: LOD0, mesh pełnego detalu ze wszystkimi kartami liści, dla drzew tuż obok gracza; LOD1–LOD2, zredukowana geometria pnia i mniej, większych kart liści, dla średniego planu; LOD3, drastycznie uproszczony klaster kart; i ostatni impostor (w istocie płaski obraz) dla wszystkiego odległego. Rzemiosło tkwi w odległościach przejścia i blendzie, by zamiana nie skakała. Ditherowane lub crossfade'owane przejścia LOD ukrywają zmianę; twarde skoczenie na złej odległości to znak zdradzający iluzję. Dostrój odległości względem swojej faktycznej kamery, nie domyślnych.

Impostory: udawanie 3D z każdego kąta

Impostor (oktaedryczny impostor) pre-renderuje drzewo z dziesiątek kątów do atlasu, potem pokazuje najbliższy uchwycony widok jako billboard. W przeciwieństwie do płaskiego billboardu wygląda poprawnie, gdy kamera się wokół porusza, tanio, ale 3D-ish.

Odległy koniec łańcucha to tam, gdzie żyją największe oszczędności, a impostor to sprytna sztuczka, która czyni je akceptowalnymi. Prosty billboard (jeden płaski obraz obracający się w stronę kamery) wygląda dobrze na wprost, ale spłaszcza się i ślizga nienaturalnie, gdy się poruszasz. Oktaedryczny impostor rozwiązuje to, pre-renderując drzewo z wielu punktów widzenia rozmieszczonych wokół sfery, pakując je w atlas tekstury, i pokazując dowolny uchwycony kąt najbliższy aktualnemu kierunkowi kamery (blendując między najbliższymi kilkoma). Wynik czyta się jako prawdziwe drzewo 3D z każdego kąta za ułamek kosztu, dlatego impostory to kręgosłup wiarygodnych odległych lasów. Są zapiekane raz i kosztują niemal nic w rysowaniu.

Paprocie i niskie podszycie pokrywające dno lasu Warstwa podłoża szybko mnoży liczbę instancji. Podszycie potrzebuje tej samej dyscypliny co drzewa: instancjuj je, LOD-uj, i cull-uj twardo, paproć na 80 metrach w ogóle nie powinna się rysować.

Instancing i culling

Rysuj powtarzane drzewa jako instancje, by tysiące kosztowały niewiele draw calli, i cull-uj agresywnie, frustum-cull-uj to, co jest poza ekranem i distance-cull-uj małe rzeczy. Instancing naprawia koszt CPU; culling powstrzymuje cię od płacenia za niewidzialne.

Nawet z idealnymi LOD-ami, przekazanie dziesięciu tysięcy drzew jako indywidualnych obiektów zakopuje CPU. Instancing zwija wszystkie kopie drzewa w garść draw calli, co jest niepodlegające negocjacji dla prawdziwego lasu, i to dokładnie to, co zapieczenie scattera do natywnych instancji silnika ci daje. Ponadto cull-uj bez litości: frustum culling odrzuca cokolwiek poza widokiem, a distance culling usuwa clutter podłoża i drobne listowie zbyt maleńkie, by je zauważyć poza pewnym zakresem. Trawa i podszycie szczególnie powinny mieć twarde, bliskie odległości cullingu, ponieważ mnożą liczbę instancji szybciej niż drzewa. Przepływ pracy malujący gęstość i potem zapiekający do instancjonowanych meshy (jak Numivo) przekazuje silnikowi dokładnie tę zbatchowaną, cullowalną formę, której potrzebuje gęsty las.

Utrzymywanie taniego lasu przy życiu

Ciężka optymalizacja może sprawić, że las wygląda statycznie i martwo, przeciwdziałaj temu subtelnym wiatrem na bliskich LOD-ach, wariacją koloru i skali między instancjami, i cieniowaniem powstrzymującym odległe impostory od czytania jako płaski karton.

Ryzyko całej tej wydajności to las, który świetnie chodzi i czuje się bez życia. Trzy tanie dotknięcia przywracają go: wiatr: animacja wierzchołków na bliskich LOD-ach, by bliskie listowie się poruszało, nawet jeśli odległe impostory stoją w miejscu (nikt nie zauważa statycznego drzewa 300 metrów dalej). Wariacja: randomizuj skalę, rotację i odcień na instancję, by oko nie łapało powtórzenia; identyczne drzewa to zdradziecki znak kopiuj-wklej. I staranność cieniowania na impostorach: zapiecz ich oświetlenie, by nie spłaszczały się w oczywisty karton, gdy zmienia się kąt słońca. Wydaj czas klatki, który zaoszczędziłeś, na te szczegóły blisko, gdzie gracz faktycznie patrzy, a zoptymalizowany las czuje się równie żywy jak niezoptymalizowany, chodząc kilkukrotnie szybciej.

Liczby z pola, które warto ukraść

  • Zasada kosztu: płacić za odległość, odległe drzewo nie może kosztować jak bliskie
  • Łańcuch LOD: pełny mesh → zredukowany → klaster kart → impostor, każdy ~połowi koszt
  • Impostor = pre-renderowane kąty w atlasie → 3D-ish billboard z każdego widoku
  • Instancjuj powtórzenia (mało draw calli) + twardo-cull-uj małe odległe listowie
  • Utrzymuj przy życiu: wiatr na bliskim LOD + wariacja na instancję + zapieczone cieniowanie impostora

Mini-FAQ

Billboard vs impostor, jaka różnica? Billboard to jeden płaski obraz zwracający się w stronę kamery i spłaszczający się, gdy się wokół poruszasz. Impostor przechowuje wiele kątów i pokazuje właściwy, więc trzyma w 3D. Dla wszystkiego, co gracz okrąża lub mija, użyj impostorów; proste billboardy nadają się tylko dla naprawdę odległych, statycznych tła.

Ile poziomów LOD potrzebuje drzewo? Powszechnie od trzech do czterech plus impostor. Więcej nie jest automatycznie lepsze, każdy poziom to koszt autorstwa i pamięci. Wystarczająco, by każda zamiana była małym, niezauważalnym krokiem, to cel, nie maksimum.

Czy Nanite czyni to przestarzałym? Zmienia stronę geometrii (Nanite obsługuje gęsty detal mesha bez tradycyjnych LOD-ów) ale przezroczystość (karty liści), dyscyplina instancingu i culling nadal się liczą, a impostory pozostają użyteczne na odległym dystansie. Zasady przetrwają; narzędzia się przesuwają.

Co najczęściej zabija wydajność lasu? Overdraw z nakładających się przezroczystych kart liści i nieculowane listowie podłoża. Zaciśnij karty liści, cull-uj podszycie blisko, i instancjuj wszystko, to trio odzyskuje większość budżetu, zanim w ogóle dotkniesz meshy drzew.

Gęsty las to jedna z najbardziej karzących rzeczy do renderowania i jedna z najbardziej wynagradzających do trafienia w punkt. Zbuduj łańcuch LOD, pozwól impostorom nieść odległość, instancjuj i cull-uj bez litości, i wydaj oszczędności na wiatr i wariację blisko, a będziesz miał las rozciągający się aż do horyzontu i trzymający swój framerate.