2011-07-06 6 views
10

Puszczam kilka oczek (czasami powyżej 500) i chciałem poznać najlepszy sposób podejścia do tego. Byłoby bezcelowe, aby utworzyć 500 VBO, a następnie, jeśli przejdą testy ścięgno i widoczności, renderowanie ich. Czy istnieje skuteczniejszy sposób na zrobienie tego? Szukam maksymalizacji wydajności.OpenGL - Czy użyjesz spowolnionego renderowania VBO?

Odpowiedz

11

Aby odpowiedzieć na twoje pytanie, tak, wiele VBO spowolni działania. Więcej polis zwykle spowalnia renderowanie, ale więcej wywołań remisowych ma o wiele większe przeboje. Chcesz zminimalizować zmiany stanu i losowania, a także liczbę buforów, które posiadasz (i użycie pamięci).

Proponuję najpierw spojrzeć na bufory i dowiedzieć się, ile potrzebujesz potrzebujesz. Jeśli możesz grupować geometrię wsadową/instancyjną, scal statyczną geometrię w pojedynczym buforze, wydajniej używaj bufora, itp.

Po zmniejszeniu buforów do minimum możliwe będzie użycie usuwania wielu rodzajów . Widoczność, zarówno przez frustrum (być może w ósemkach), jak i okluzji, może zapewnić znaczny wzrost wydajności. Główną ideą jest dyskwalifikacja geometrii tak szybko i prosto, jak to tylko możliwe, dlatego zaczynasz od szorstkich testów (octree), potem nieco bardziej szczegółowych (prawdopodobnie AABB i/lub uproszczonego kadłuba), a następnie okluzji, a następnie rysowania.

Oto good article on frustrum culling, który dotyka bitu na quadtrees (i przez rozszerzenie, octrees). Schematy, objaśnienia i przykładowy kod.

Pozbycie się okluzji OpenGL wydaje się nieco mniej popularne, chociaż this one from GPU Gems może być dobrym początkiem.

+1

Dziękuję za odpowiedź. Jestem uśpiony frustum za pomocą drzewa binarnego i działa dobrze. Byłem po prostu bardziej zaniepokojony faktem, że posiadanie 500 buforów pokona całą esencję zysków prędkości związanych z VBO. –

+1

Po prostu nie zrozumcie tego źle: Korzystanie z kilku VBO-ów w ogóle jest korzystne (kilkadziesiąt na raz), ponieważ pozwala GPU na pobieranie z jednego podczas przesyłania kolejnego i przenoszenie danych między pamięcią GPU a pamięcią główną (które czasami musi wykonać kierowca) będą również bardziej wydajne, podobnie jak aktualizacja danych. Po prostu, jak zauważyli peachykeen, posiadanie wielu setek oznacza zmianę stanu wieleset razy, co ostatecznie jest szkodliwe. – Damon

+2

Tak, VBO są dobre (nigdy nie powinieneś wysyłać geometrii przez każdą ramkę, jeśli istnieje sposób, aby tego uniknąć), ale posiadanie zbyt dużej ilości buforów może spowodować błędy pamięci i znacznie obniżyć wydajność. Nie jestem pewien, czy 500 jest * za dużo *, ale jest wystarczająco silny, aby można było go wyciąć. – ssube