Wreszcie, po wielu badaniach, mogę stwierdzić, że, jak ktoś wcześniej powiedział, nie ma uniwersalnej „najlepszej” metody. Ale moje badania doprowadziły mnie do znajomości następujących rzeczy:
W zależności od siatki w końcu użyjesz:
- Spherified Cube: każda metoda LOD z implementacją quadtree będzie działać dobrze, musisz tylko zadbać o specjalne przypadki, takie jak granice między twarzami, w którym to przypadku twój quadree musi mieć wskaźnik do sąsiada na sąsiedniej twarzy na każdym poziomie.
- Każda inna: myślę, że ROAM (nowsza wersja 2.0 lub dowolne inne rozszerzenie jak BDAM, CABTT lub RUSTIC) poradzi sobie dobrze, jednak te algorytmy są trudne do pracy, wymagają więcej pamięci i są nieco wolniejsze niż inne podejścia z kostkami.
Istnieje wiele metod LOD, które mogą dobrze pasować, ale moje osobiste 5 najlepszych to:
- Ciągłe zależne od odległości LOD (CDLOD)
- Geomety Clipmaps oparte na GPU (GPUGCM)
- Chunked LOD
- Renderowanie terenów z teselacją GPU OpenGL (książka: OpenGL Insight, rozdział 10)
- Geometrical MipMapping
Każdy z nich oferuje unikalny sposób renderowania terenów, na przykład CDLOD ma bardzo łatwą implementację za pomocą shaderów (GLSL lub HLSL), ale może być również implementowany na procesorze (dla starszych urządzeń), jednak celem Planet Rendering jest eksplozja najlepszy na współczesnych procesorach graficznych, więc GPUGCM jest najlepszy, gdy chcesz ścisnąć swój GPU. Oba działają bardzo dobrze w przypadku renderowania dużych terenów w oparciu o dane, procedury lub mieszane (teren oparty na ustalonych danych lub mapach wysokości i szczegółach dodanych do prac proceduralnych).
Istnieje również rozszerzenie sferyczne podstawowej metody Geometrical Clipmaps, ale ma pewne problemy, ponieważ próbki płaskie mapy wysokości muszą zostać sparametryzowane za pomocą współrzędnych sferycznych.
Chunked LOD, z drugiej strony, jest idealny dla starszego sprzętu, nie wymaga żadnych obliczeń po stronie GPU do pracy, jest idealny dla dużych zestawów danych, ale nie może obsługiwać danych proceduralnych w czasie rzeczywistym (może z pewnymi modyfikacjami, może)
Korzystanie z shaderów Tessellation to kolejna technika, bardzo nowa, odkąd pojawił się OpenGL 4.x. Moim zdaniem może być najlepszy, ale mówimy o renderowaniu planet, napotykamy problem, który inne metody mogą poradzić sobie bardzo łatwo i jest to o precyzji.
Jeśli nie chcesz, aby Twoja precyzja wynosiła tylko 1 km między wierzchołkami, wybierz shadery Tesselacji. Problem z naprawdę dużymi terenami z tą metodą polega na tym, że jitter jest trudny do rozwiązania (a przynajmniej dla mnie, ponieważ jestem nowy w shadery teselacyjnym).
Geomipmapping jest świetną techniką, wykorzystuje quadtree i ma niski błąd rzutowania pikseli, ale do renderowania planetarnego będziesz musiał ustawić co najmniej 16+ poziomów szczegółów, co oznacza, że będziesz potrzebował (do zszywania celów) dodatkowych łatek łączenie różnych poziomów i dbanie o poziom sąsiada może być żmudne do rozwiązania, szczególnie przy użyciu 6 ścian terenu.
Istnieje jeszcze jedna metoda, szczególnie sama w sobie: „Mapowanie siatki projekcyjnej dla terenu planetarnego” doskonała do wizualizacji, ale ma swoje wady, jeśli chcesz dowiedzieć się więcej, przejdź do linku.
Problemy:
Jitter : Większość współczesnych układów GPU obsługuje tylko 32-bitowe wartości zmiennoprzecinkowe, co nie zapewnia wystarczającej precyzji do manipulowania dużymi pozycjami w terenach o skali planetarnej. Jitter pojawia się, gdy przeglądarka powiększa się, obraca lub porusza, a następnie wielokąty zaczynają się odbijać w przód iw tył.
Najlepszym rozwiązaniem jest użycie metody „Rendering względem oka za pomocą GPU”. Metodę tę opisano w książce „3D Engine Design for Virtual Globes” (jestem pewien, że można ją również znaleźć w Internecie), w której zasadniczo musisz ustawić wszystkie swoje pozycje z podwójnymi wartościami na procesorze (łatki, clipmapy, obiekty, frustrum, kamera itp.), a następnie MV jest wyśrodkowany wokół widza, ustawiając jego tłumaczenie na (0, 0, 0) T, a podwójne są kodowane w stałej reprezentacji przy użyciu bitów ułamkowych (mantysy) dwóch pływaków, nisko i wysoki jakąś metodą (przeczytaj o użyciu implementacji Ohlarika i biblioteki Fortran DSFUN90).
Chociaż moduł cieniujący wierzchołki wymaga tylko dwóch dodatkowych odejmowań i jednego dodania, GPU RTE podwaja ilość pamięci bufora wierzchołków wymaganej dla pozycji. To niekoniecznie podwaja wymagania dotyczące pamięci, chyba że przechowywane są tylko pozycje.
Precision Buffer Depth : walka Z. Ponieważ renderujemy bardzo duże tereny, w tym przypadku: planety, bufor Z musi być OGROMNY, ale nie ma znaczenia, jakie wartości ustawisz dla znear i zfar, zawsze będą problemy.
Ponieważ bufor Z zależy od interwału punktu zmiennoprzecinkowego, a także jest liniowy (chociaż rzut perspektywiczny jest nieliniowy), wartości w pobliżu oka cierpią z powodu walki Z, ponieważ brak precyzji 32-bitowych pływaków ma.
Najlepszym sposobem rozwiązania tego problemu jest użycie „Logarithmic Depth Buffer”
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Logarytmiczny bufor głębokości poprawia precyzję bufora głębokości dla odległych obiektów dzięki zastosowaniu rozkładu logarytmicznego dla zscreen. Wymienia precyzję na bliskie obiekty na precyzję na odległe obiekty. Ponieważ renderujemy za pomocą metody LOD, dalekie obiekty wymagają mniejszej precyzji, ponieważ mają mniej trójkątów.
Należy wspomnieć o tym, że wszystkie wymienione metody (oprócz siatki rzutowej) są bardzo dobre podczas fizyki (głównie kolizje) z powodu podstawy Quadtree, co jest obowiązkowe, jeśli planujesz stworzyć grę.
Podsumowując, po prostu sprawdź wszystkie dostępne opcje i wybierz tę, którą uważasz za wygodniejszą, moim zdaniem CDLOD robi świetną robotę. Nie zapomnij rozwiązać problemów z fluktuacjami i buforem Z, a co najważniejsze: baw się dobrze!
Aby uzyskać więcej informacji o LOD, sprawdź ten link .
Aby uzyskać pełną prezentację dotyczącą sfingowania sześcianu, sprawdź ten link .
Aby uzyskać lepsze wyjaśnienie dotyczące rozwiązywania problemów związanych z drganiami i buforowaniem Z, zapoznaj się z tą książką .
Mam nadzieję, że ta mała recenzja okaże się przydatna.