Autor Wątek: Zastosowanie quadtree oraz frustrum culling do renderowania siatki terenu  (Przeczytany 875 razy)

Offline Montjet

  • Użytkownik

# Lipiec 01, 2016, 13:12:04
Jestem w trakcie implementacji algorytmu na bazie drzewa czwórkowego i zastosowaniu w nim Frustum Culling do renderowania siatki terenu.

Węzły będą przechowywały adres do kolejnych węzłów oraz 4 współrzędne skrajnych wierzchołków (potrzebne dla algorytmu Frustum Culling).
Ostatnie węzły będą zawierać mapę wysokości oraz przesunięcie siatki (używanej do wysyłania jako zmienna jednorodna - wierzchołki siatki mapy będą przesuwane w GPU - zawsze będzie 1 model siatki).

Jako że jestem zielony proszę o wypowiedzenie się na temat tej strategii, czy nie jest już to przestarzała metoda?
Frustum Culling na podstawie: http://www.lighthouse3d.com/tutorials/view-frustum-culling/


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Mergul

  • Użytkownik

  • +2
# Lipiec 02, 2016, 21:42:05
Nie wiem na ile będzie to wydajne, i dosyć ciężko to stwierdzić :) Najlepiej coś przetestować, żeby wiedzieć czy będzie dobre :) Ogólnie warto pomyśleć nad LOD, bo bez tego to nie ma co nawet myśleć o rozległym terenie. Chyba, że robisz strategie. Dodatkowo pytanie czy warto budować jedną siatkę i przesyłać resztę teksturą. Albo do tekstury wysokości będziesz musiał jeszcze dodać teksturę globalnych normalnych i tangentów (2 dodatkowe tekstury), do czego ostatecznie jeszcze dojdą tekstury zwykłe, albo będziesz to liczyć na podstawie mapy wysokości. Też trochę średnio się to prezentuje :D Dodatkowo jeżeli faktycznie chcesz zyskać wydajność używając jednej siatki, to wypadałoby wykorzystać instancing. Ale wtedy z kolei jak wysyłać mapy wysokości. Można wykorzystać tablice tekstur i jakoś to indeksować. Ale znowu pytanie czy warto :D
Zawsze, możesz zrobić tak, że budujesz sobie siatkę oddzielnie dla każdego chunka. Dodatkowo budujesz kilka tablic indeksów (te już będą globalne dla wszystkich siatek), automatycznie budując sobie LOD. Współrzędne tekstur Ci nie potrzebne, ponieważ będą jednoznaczne z pozycją xy. Do tego pozycja może być wysyłana nawet jako byte. Normalne i tangenty można spakować do int-ów. Wysokość jako float.
Ewentualnie jak bardzo będzie Ci sie chciało to możesz spróbować jeszcze optymalizować siatkę, budując oddzielne indeksy dla każdego chunka, zmniejszając gęstośc tam gdzie jest płasko. Ale też nie wiem czy warto, więc to trzeba by było przetestować ;) Dodatkowo plus jest taki, że łatwo do takich siatek zbudować dynamiczne przejście poziomów szczegółowości. Chociaż. Dla tego sposobu z teksturą też łatwo :D
Ja programuję w OpenGL-u, nie jestem do końca pewien jak to wygląda w Direct, ale chyba podobnie :D Jeżeli  do tego wszystkiego będziesz trzymać wiele siatek, od różnych chunków w jednym buforze (ew. w kilku jak będzie dużo tych chunków), to nie będziesz musiał bindować między renderami siatek, co też da kopa do wydajności :D