W jaki sposób współczesne gry wpływają na poziom szczegółowości geometrii dla siatek obiektów, takich jak postacie, ukształtowanie terenu i liście? Moje pytanie składa się z dwóch części:
- Jak wygląda potok zasobów? Czy artyści tworzą model o wysokiej poli, który jest następnie dziesiątkowany? Jeśli tak, jakie algorytmy dziesiętne są najbardziej popularne? Czy siatki LOD są czasami wykonywane ręcznie?
- W jaki sposób silniki przechodzą między różnymi LOD obiektów w czasie wykonywania? Czy są jakieś płynne lub progresywne przejścia?
Odpowiedź może brzmieć: „różne studia wykorzystują różne techniki”. Jeśli tak, proszę podać niektóre z najczęstszych praktyk. Byłoby również świetnie, gdybyś mógł wskazać mi białe księgi / slajdy, które obejmują konkretne przykłady.
Odpowiedzi:
W przypadku geometrii LOD większość gier po prostu przełącza się między kilkoma predefiniowanymi siatkami LOD. Na przykład „Infamous: Second Son” używa 3 oczek LOD ( Adrian Bentley - „inFAMOUS: Second son engine postmortem”, GDC 2014 ), a „Killzone: Shadow Fall” używa 7 oczek LOD na postać ( Michal Valient - „Killzone: Shadow Fall” demo postmortem ”, Devstation2013 ). Większość z nich jest generowana, ale ważniejsze (jak główny bohater) można wykonać ręcznie. Siatki są często generowane przy użyciu popularnego oprogramowania pośredniego Simplygon, ale czasami są one po prostu generowane przez grafików w ich ulubionym pakiecie 3D.
Gry o dużej odległości losowania dodatkowo wykorzystują oszustów do liści, drzew i wysokich budynków ( Adrian Bentley - „inFAMOUS: Second Son engine postmortem”, GDC 2014 ). Stosują również hierarchiczne LOD, które zastępują zestaw obiektów jednym. Na przykład w „Just Cause 2” drzewa są najpierw renderowane indywidualnie jako normalne siatki LOD, następnie indywidualnie jako oszustki, a na koniec jako pojedyncza połączona siatka leśna ( Emil Persson, Joel de Vahl - „Zaludnianie masywnego świata gry”, Siggraph2013 ) i w Odległe części „Sunset Overdrive” zostały zastąpione pojedynczą siatką generowaną automatycznie w trybie offline ( Elan Ruskin - „Streaming Sunset Overdrive's Open World”, GDC2015 ).
Kolejnym elementem systemu LOD jest uproszczenie materiałów i shaderów. Na przykład „Killzone: Shadow Fall” wyłącza przestrzeń styczną i normalne mapowanie odległych LOD ( Michał Valient - „Killzone: Shadow Fall demo postmortem”, Devstation2013 ). Zwykle jest to realizowane przez wyłączenie globalnie zestawu funkcji modułu cieniującego dla LOD, ale w przypadku silników z grafami modułu cieniującego, w których artyści mogą tworzyć niestandardowe moduły cieniujące, należy to zrobić ręcznie.
W przypadku przejść LOD niektóre gry po prostu zamieniają siatki, a niektóre wykorzystują dithering do płynnych przejść LOD - przy przełączniku LOD renderowane są dwa oczka: pierwsze stopniowo zanikają, a drugie zanikają ( Simon Schreibt Blog - „Assassins Creed 3 - LoD Blending” ). Klasyczne techniki progresywnej siatki nie są wykorzystywane, ponieważ wymagają kosztownej aktualizacji siatki i przesłania do GPU. Tesselacja sprzętowa jest używana w kilku tytułach, ale tylko w celu dopracowania najbardziej szczegółowego LOD, ponieważ jest powolna iw ogólnym przypadku nie może zastąpić wstępnie zdefiniowanych LOD geometrii.
LOD terenu są obsługiwane osobno w celu wykorzystania jego specyficznych właściwości. LOD geometrii terenu jest zwykle implementowany przy użyciu clipmap ( Marcin Gollent - „Tworzenie i renderowanie krajobrazu w REDengine 3” ). LOD dla materiału terenu są obsługiwane podobnie jak siatki LOD lub przy użyciu wirtualnej tekstury Ka Chen - „Adaptacyjne wirtualne renderowanie tekstur w Far Cry 4 .
Na koniec, jeśli chcesz zobaczyć prawdziwe potoki LOD gry, po prostu przejrzyj dokumentację dowolnego z nowoczesnych silników gier: Unreal Engine 4 - „Tworzenie i używanie LOD ” , CryEgnine - Statyczny LOD i Unity - LOD .
źródło
LOD (poziom szczegółowości) oznacza zarządzanie obiektami w różnych skalach wyświetlania, które mogą być podzielone na dwie części. Możesz jednak użyć jednego z nich i to wystarczy w większości przypadków.
Pokaż / ukryj warstwy (grupa obiektów tego samego typu) w zależności od wielkości (skala wyświetlania).
Metoda oparta na geometrii algebraicznej, zwana Generalizacją (która jest algorytmem upraszczającym wielokąty). spójrz na poniższy obrazek
Najsłynniejsza i najskuteczniejsza metoda uogólnienia (uproszczenia) siatki wielokątów jest znana jako twierdzenie wielościanu Descartesa-Eulera (równanie 4.5 przepraszam, jeśli mam na myśli książkę, najlepiej, co potrafię) i jest używane przez większość przestrzennych baz danych na przykład moduły PostGIS w PostgreSQL. Po prostu usuwa mniejsze boki wielokąta i tworzy bardzo zaokrąglony. (Powyżej zdjęcia)
Aby zaimplementować LOD w grze, musisz zapisać skalę swojej mapy (sceny) i zarządzać nią podczas operacji powiększania / pomniejszania. Skala zmienia się od zera do nieskończoności i musisz podzielić to na określoną liczbę zakresów, na przykład coś takiego:
Następnie musisz określić, które typy obiektów (warstw) powinny być widoczne lub niewidoczne w każdym z powyższych zakresów. Na przykład mały typ obiektu, taki jak zawór hydrantowy, nie powinien być widoczny, gdy użytkownik znajduje się w czwartym zakresie, ponieważ będzie bardzo mały w tej skali i nie może być dyskryminowany, więc nie ma znaczenia, jeśli pominiesz rysowanie go na ekran.
Kiedy więc użytkownik używa powiększania i pomniejszania w celu zmiany powiększenia, przesuwa się on powyżej powyższych granic z jednego do drugiego zakresu, a gra wykorzystuje te skale wyświetlania do zarządzania poziomem szczegółów poprzez pokazywanie lub ukrywanie obiektów na scenie. To dyskretne rozwiązanie, które nagle blaknie podczas operacji zmniejszania, jednak mając dokładnie zdefiniowane skale wyświetlania i zakresy powiększeń, użytkownik nic nie poczuje.
Powyższa grupa 4 zakresów jest tylko przykładem i musisz znaleźć najlepszą dla swojej sprawy metodą prób i błędów. Nie ma na to żadnej reguły.
Czasami gry używają własnych metod LOD, Subway Surfer na chwilę, pokazuje mały prostokąt bez tekstury, aby pokazać budynek z daleka, a gdy zbliża się nagle, robi się tekstury, gracz odczuwa to. Nie mówiłeś o swoim systemie projekcji, co jest bardzo ważne, nie mówiłeś też o tym, jaką grę tworzysz.
Załóżmy jednak, że wdrażasz pełną grę 3D z OpenGl i chcesz przefiltrować trochę siatki przed przeniesieniem ich do sprzętu graficznego, jestem pewien, że pomoże to zmniejszyć operacje wiązania / rozpinania obiektów buforowych i tablic wierzchołków (VBO, VAO) podczas radzenie sobie z OpenGl.
W większości przypadków nie jest konieczne wdrażanie algorytmu uogólnienia, a filtrowanie obiektów po prostu działa i pozwala uzyskać wymaganą wydajność (częstotliwość odświeżania), jednak jest to całkowicie zależne od przypadku. Chociaż jest to prosty algorytm, który po prostu usuwa małe boki wielokąta, musisz zdefiniować próg, który jest iloczynem wielkości i stałej liczby, aby większe boki były filtrowane z dużo większego punktu widzenia.
Zapominanie o zarządzaniu warstwami i wdrażanie tylko algorytmu generalizacji Eulers zapewnia bardzo schludną i ciągłą metodę, w której wystarczy sprawdzić każdą stronę i linię w stosunku do wcześniej określonego progu i pokazać je tylko w przypadku, gdy są wystarczająco duże, aby można je było rozróżnić na ekranie.
PS: powiększenie to liczba zmiennoprzecinkowa> 0, która jest równa 1 / skala, a skala jest zwykle <1, ponieważ skala 1: 1 oznacza, że masz rzeczywiste długości świata w grze.
źródło
Iman przygotował już pełną odpowiedź, ale chcę coś do niej dodać
LOD można wykonać na dwa różne sposoby
Na przykład mipmapowanie jest dobre, szybkie, ale ciężkie, które należy do drugiej grupy powyżej
tutaj możesz znaleźć dobre wyjaśnienie mipmapowania i kodu implementacyjnego z OpenGl.
źródło