Właśnie zaczynam pracę z OpenGL i próbuję go użyć do stworzenia gry 2D. W tej grze mam sześciokątną siatkę złożoną z bardzo dużej różnorodności różnokolorowych sześciokątów. Jako początkujący programista OpenGL widzę dwa sposoby rysowania tej siatki:
- Użycie bufora wierzchołków z danymi dla pojedynczego sześciokąta, następnie użycie jednolitej wartości przesunięcia i iteracja na CPU, aby narysować ten sam program wiele razy, aż będę miał siatkę.
- Tworzenie pojedynczego bardzo dużego wstępnie obliczonego bufora wierzchołków, który rysuje wszystkie sześciokąty w jednym wywołaniu.
Jaka jest najbardziej wydajna metoda? Czy jest na to lepszy sposób?
Odpowiedzi:
Istnieje kilka sposobów na stworzenie takiej siatki.
Najbardziej efektywnym sposobem byłoby wystąpienie. W ten sposób wykonujesz swój sześciokąt tylko raz w VBO i renderujesz go sto, tysiąc lub milion razy. Możesz to zrobić ręcznie, używając shaderów z mundurami, jak wspomniano w punkcie 1, ale jest też wbudowana funkcja OpenGL. W tym celu spójrz na glDrawElementsInstanced .
Zauważ, że instancja jest szybsza niż inne metody, jeśli narysujesz więcej niż pewną liczbę instancji obiektów. Na przykład rysunek 300 może być szybszy przy użyciu 1 dużego VBO, ale rysunek 2 miliony może być szybszy, jeśli użyjesz renderowania instancji.
Jeśli używasz renderowania instancji, możesz wysyłać dane dla poszczególnych obiektów za pomocą dzielników atrybutów . W twoim przypadku chciałbyś wysłać pozycję i kolor.
Dobry samouczek dotyczący renderowania instancji: kliknij
Naprawdę najlepszym sposobem jest wypróbowanie obu metod i sprawdzenie ilości milisekund potrzebnych do narysowania 1 klatki. W ten sposób uczysz się także na dwa sposoby, co zawsze jest dobre.
Zauważ też, że renderowanie instancji jest nowoczesną funkcją OpenGL i że będziesz musiał użyć shaderów, aby z niego korzystać. Ale zawsze najlepiej jest nauczyć się tego od samego początku.
źródło
Metoda 1 jest łatwiejsza do kodowania i będzie w porządku, o ile nie będzie widocznych zbyt wielu sześciokątów na raz. Możesz trzymać się tego, ponieważ jesteś nowy w OpenGL, aby uniknąć nadmiernego komplikowania na raz.
Jeśli widoczna jest jednocześnie duża liczba sześciokątów (na przykład kilkaset lub ponad tysiąc), konieczne byłoby zastosowanie metody niższego obciążenia, aby uniknąć obciążenia procesora tak wieloma pojedynczymi losowaniami. Metoda 2 zadziałałaby w przypadku tego, a nawet lepiej, użycia instancji. Spodziewałbym się, że instancja będzie szybsza niż metoda 2, a na pewno nie gorsza, ponieważ wystarczy zaktualizować bufor danych dla poszczególnych instancji zamiast (znacznie większego) bufora danych wierzchołków dla wszystkich instancji.
źródło