Demystifying „fragmentaryczny poziom szczegółowości”

17

Niedawno staram się wprowadzić sensowny system szczegółowości w Unity. Będę generować cztery płaszczyzny siatki, każda z mapą wysokości, ale chyba nie jest to w tej chwili zbyt ważne. Mam dużo pytań po przeczytaniu na temat tej techniki, mam nadzieję, że nie jest to zbyt wiele, aby zadać wszystko za jednym razem, ale byłbym bardzo wdzięczny za to, że ktoś pomógłby mi zrozumieć tę technikę.

1 : Nie rozumiem, w którym momencie w dół potoku Chunked LOD, że siatka zostaje podzielona na kawałki. Czy dzieje się to podczas początkowego generowania siatki, czy też istnieje osobny algorytm, który to robi.

2 : Rozumiem, że struktura danych Quadtree jest używana do przechowywania danych Chunked LOD , myślę, że trochę mi brakuje tego punktu, ale czy w quadtree są przechowywane dane wierzchołków i trójkątów dla każdego poziomu podziału?

3a : Jak zwykle oblicza się odległość kamery. Podczas czytania o quadtree dużo wspomina się o wyrównanych do osi obwiedniach. Czy w takim przypadku każdy fragment miałby pole ograniczające kolizję, aby wykryć kamerę lub odtwarzacz w pobliżu? czy jest na to lepszy sposób? (może raycast?)

3b : Czy fragmenty same obliczają odległość kamery?

4 : Czy każdy fragment ma tę samą „rozdzielczość”. na przykład na najwyższym poziomie siatka będzie miała wymiary 32 x 32, a każdy podzielony węzeł również będzie miał wymiary 32 x 32. Przykład poniżej:

przykład fragmentowanego LOD

Caius Eugene
źródło
Jeśli ktoś zna lepsze podejście LOD dla planety proceduralnej, byłoby to również interesujące.
Caius Eugene,
Zakładam, że już przeglądałeś oryginalny artykuł SIGGRAPH Thatcher Ulrich i powiązany program? tulrich.com/geekstuff/chunklod.html
drxzcl
Mam, do pewnego stopnia bardzo pouczające, ale nie dotyczy to szczegółów ani podejść do implementacji. Dziękuję
Caius Eugene,
1
Istnieje wiele opcji planetarnego LOD; vterrain.org/LOD/spherical.html
OriginalDaemon

Odpowiedzi:

12

1: Nie rozumiem, w którym momencie w dół potoku Chunked LOD, że siatka zostaje podzielona na kawałki. Czy dzieje się to podczas początkowego generowania siatki, czy też istnieje osobny algorytm, który to robi.

Nie ważne. Na przykład możesz zintegrować tworzenie porcji z algorytmem generowania siatki. Możesz to zrobić nawet dynamicznie, dzięki czemu niższe poziomy są dodawane dynamicznie (np. W miarę zbliżania się gracza) za pomocą algorytmu wyrafinowania podobnego do plazmy. Można również wygenerować siatkę o wysokiej rozdzielczości na podstawie danych wejściowych wykonawcy lub danych pomiaru wysokości i agregować ją we wszystkich częściach LOD w momencie finalizacji zasobu. Lub możesz mieszać i łączyć. To zależy od twojej aplikacji.

2: Rozumiem, że struktura danych Quadtree jest używana do przechowywania danych Chunked LOD, myślę, że trochę mi brakuje tego punktu, ale czy w kwadracie są przechowywane dane wierzchołków i trójkątów dla każdego poziomu podziału?

Niekoniecznie. Drzewo tylko przechowuje informacje o geometrii i sposobie jej renderowania. Może to oznaczać posiadanie listy wierzchołków / twarzy w każdym węźle drzewa. Bardziej realistycznie w dzisiejszych czasach, przechowujesz uchwyty oczek / instancji w pamięci GPU.

3a: Jak zwykle oblicza się odległość kamery. Podczas czytania o quadtree dużo wspomina się o wyrównanych do osi obwiedniach. Czy w takim przypadku każdy fragment miałby pole ograniczające kolizję, aby wykryć kamerę lub odtwarzacz w pobliżu? czy jest na to lepszy sposób? (może raycast?)

Bardzo tanią i łatwą opcją jest użycie odległości do punktu środkowego porcji, a następnie jej poprawienie. Wiesz, że odległość ta jest zawsze niedoceniana: jeśli punkt środkowy znajduje się w odległości Z, oznacza to, że połowa fragmentu jest bliżej. To, czego nie wiemy, to orientacja. Jeśli oglądamy fragment o szerokości wkrawędzi, najbliższy fragment będzie w pewnej odległości Z-w. Jeśli jednak oglądamy fragment w pierwszej kolejności, najbliższy bit będzie w pewnej odległości Z-sqrt(2)*w. Jeśli możesz żyć z tą niepewnością (prawie zawsze możesz), to koniec. Pamiętaj, że możesz również poprawić kąt widzenia za pomocą podstawowej trygonometrii.

Wolę obliczyć absolutną minimalną odległość od kamery do fragmentu, aby zminimalizować artefakty. W praktyce oznacza to wykonanie testu odległości punkt-kwadrat . To trochę więcej pracy niż obliczanie odległości do punktów środkowych, ale nie jest tak, że wykonasz zillion tych wszystkich klatek.

Jeśli możesz do tego wykorzystać silnik fizyki, zrób to, ale naprawdę chcesz o tym myśleć bardziej w kategoriach „kwerendy odległości” niż „kolizji”.

3b: Czy fragmenty same obliczają odległość kamery?

To zależy od konstrukcji silnika. Zalecałbym jednak, aby liście były stosunkowo lekkie. W zależności od platformy sam narzut związany z wykonaniem przez kilka tysięcy fragmentów terenu każdej aktualizacji może poważnie wpłynąć na wydajność.

4: Czy każdy fragment ma tę samą „rozdzielczość”. na przykład na najwyższym poziomie siatka będzie miała wymiary 32 x 32, a każdy podzielony węzeł również będzie miał wymiary 32 x 32.

Nie muszą, ale jest to wygodne, jeśli wszystkie fragmenty zajmują tyle samo miejsca. Następnie możesz zarządzać pamięcią (GPU) w jednostkach „porcji”. Łatwiej jest również usunąć / ukryć szwy między dwoma kawałkami o różnych rozmiarach, jeśli jedna rozdzielczość jest wielokrotnością drugiej, ponieważ mają one więcej wierzchołków. (np. 32x32 i 64x64 jest łatwiejszy w zarządzaniu niż 32x32 i 57x57) (dzięki Guiber!). Jeśli masz dobry powód, aby zmieniać rozmiar geometrii porcji, na pewno idź.

drxzcl
źródło
2
Łatwiej jest również usunąć / ukryć szwy między dwoma kawałkami o różnych rozmiarach, jeśli jedna rozdzielczość jest wielokrotnością drugiej, ponieważ mają one więcej wierzchołków. (np. 32 x 32 i 64 x 64 jest łatwiejsze do zarządzania niż 32 x 32 i 57 x 57)
Alayric 12.12.12
Genialna odpowiedź, wyjaśniono wiele rzeczy. Szczególnie, że wiele implementacji sprowadza się do rozważenia możliwości silnika. W przypadku 3a nadal nie jestem pewien, kiedy odpalić zapytanie o odległość, dwie implementacje, które uważałem za dźwięk procesora ciężkie, przeprowadzę więcej badań w tym zakresie. Dziękuję
Caius Eugene,
1
@CaiusEugene: Myślę, że przesadnie myślisz o determinacji odległości. Dodałem bardzo tani, bardzo prosty algorytm do odpowiedzi w punkcie 3a, który powinien zacząć.
drxzcl