W moim silniku tworzę nieskończony teren z wykorzystaniem algorytmu szumu Perlina obliczonego na procesorze.
Tworzenie terenu przebiega następująco:
- Jeśli kamera znajduje się w pobliżu rozładowanej łatki, utwórz ją
- Oblicz tablicę szumów 513 x 513 z podanymi granicami
- Obliczanie normalnych, stycznych, dwumianowych, indeksów
- Przekaż dane do vbo
Plusy:
- Trzeba je renderować tylko w razie potrzeby
- Łatwa do zderzenia
Kon
- Powolne 64 łatki 513x513 są tworzone w 3,1s (jeden wątek). Dla każdej płytki ~ 20ms wytwarzanie szumu, ~ 25ms wierzchołki, normalne, styczna, bitangent, indeksy. Gdy kamera porusza się szybko, użytkownik może zauważyć ładowanie płytek.
- pamięć zużywa ???
Teraz zastanawiałem się, jak to przyspieszyć, generując teren całkowicie na GPU. Istnieją jednak pewne wątpliwości:
- Jeśli moduły cieniujące działają w każdej ramce, to czy ta moc obliczeniowa nie jest marnowana na obliczanie hałasu w kółko? Można tego uniknąć, zapisując wynik do tekstury RBGA i wykorzystując go później w module cieniującym wierzchołki do przemieszczania, ale zwiększając zużycie pamięci. Z drugiej strony, jeśli stworzenie byłoby super szybkie, tylko widoczne kafelki powinny pozostać w pamięci. Jednak odłączenie bufora powoduje synchronizację gpu-cpu, co może spowolnić aplikację (mam rację?)
- Jeśli teren jest tylko płaską siatką przesuniętą przez moduł cieniujący wierzchołki, należy wykonać tę samą pracę na CPU, aby obliczyć wysokość i normalne w danym punkcie kolizji.
- To tylko koncepcja, ale aby przyspieszyć wszystko, myślałem o rzutowaniu siatki na rzutnię, tak aby używana była tylko minimalna liczba wierzchołków. Myślisz, że to zadziała?
Moje ostatnie pytanie brzmi:
Jaka jest najlepsza / najszybsza / szeroko stosowana technika tworzenia nieskończonego terenu na GPU?