Kiedy używać tablicy wierzchołków, a kiedy VBO?

14

Próbuję dowiedzieć się o tablicach wierzchołków i obiektach buforów wierzchołków , ale nie rozumiem różnic w zakresie:

  • przypadek użycia (geometria statyczna, taka jak tereny, geometria, która zmienia każdą ramkę jak układ cząstek itp.)
  • występ
  • przenośność (stara karta graficzna, konsole, urządzenia takie jak Android lub iPhone itp.)

jakieś wyjaśnienia?

nkint
źródło
3
Dla każdego, kto tu przybywa, sprawdź najbardziej głosowaną odpowiedź tutaj .... stackoverflow.com/questions/430555/…
afuzzyllama

Odpowiedzi:

14

Oto przyzwoity opis na temat VBO.

Występ

Oto dobry przegląd semantyki wywoływania.

Oto kolejny dobry przegląd problemów z wydajnością; widzimy w nim, że VBO są bardziej wydajne niż tablice.

Powodem, dla którego wolimy VBO, jest to, że dane są ładowane na kartę, więc nie musisz przesyłać ich co każdą klatkę. W zależności od typu utworzonego VBO, możesz podać sterownikowi karty graficznej wskazówki dotyczące użytkowania (zapis-wiele, odczyt-wiele vs. zapis-wiele, nigdy nie czytaj itp.).

Stosowanie

VBO są naprawdę dobre dla geometrii statycznej, takiej jak teren, którego nie spodziewasz się zmienić, lub dla geometrii instancji.

Macierze wierzchołków są dobre dla danych, które często się zmieniają, ale które są również odczytywane przez maszynę hosta - więc do bezpośredniego renderowania danych, które są manipulowane (na przykład bufory danych dalmierza laserowego, tam gdzie ich używałem) często. Jeśli uda ci się uniknąć odczytu danych na urządzeniu hosta (po prostu wypychając je na kartę), dobrym rozwiązaniem są VBO w trybie tylko do zapisu.

Ruchliwość

Tablice wierzchołków po stronie klienta Są one dostępne w wersji OpenGL wcześniejszej niż 3.0, przestarzałe w wersji 3.0 i od wersji 3.1+. OpenGL ES obsługuje je (OpenGL ES 2 nie obsługuje).

VBO Są dostępne po OpenGL 1.5. To jedyny sposób przechowywania danych geometrii w OpenGL ES 2 (a więc WebGL).

ChrisE
źródło
2
W tym pliku PerformanceTuning.pdf napisano, że VBO „mogą zaszkodzić wydajności w nieoptymalnych przypadkach” ... ale to nie wyjaśnia. Masz pojęcie, jakie są te przypadki? Mam przypadek, w którym muszę aktualizować geometrię co ramkę, więc zastanawiam się, czy tablica wierzchołków byłaby lepsza czy gorsza niż VBO w tym przypadku. Dzięki.
sidewinderguy
1
przeczytaj opengl.org/sdk/docs/man/xhtml/glDrawElements.xml i opengl.org/wiki/GlDrawElements - Tablice wierzchołków NIE są przestarzałe ani usunięte, nadal są obsługiwane od OpenGL 4.x;
1
@vaxquis Tablice wierzchołków po stronie klienta są nieaktualne. Tablice wierzchołków po stronie serwera nie są. VAO są czymś innym i mają na celu zapisanie stanu. W poście nie było nic złego, choć mogłoby być dokładniejsze, gdyby było po stronie klienta. Ale myślę, że to było dorozumiane.
concept3d
1
„Tablice wierzchołków po stronie klienta są nieaktualne. Tablice wierzchołków po stronie serwera nie są.” „Tablice wierzchołków Są one dostępne w wersji OpenGL wcześniejszej niż 3.0, przestarzałe w wersji 3.0 i zniknęły w wersji 3.1+”. „możesz wstępnie określić oddzielne tablice wierzchołków (...) i użyć ich do skonstruowania sekwencji prymitywów za pomocą jednego wywołania glDrawElements. Rdzeń w wersji 4.4” - W tych stwierdzeniach widzę sprzeczność.
2
Dodatkowo, zanim powiesz coś „jest przestarzałe”, podaj źródło takiego oświadczenia, najlepiej w oficjalnym dokumencie. Wskazanie z StackExchange na StackOverflow jako dowód NIE jest sposobem, w jaki nauka działa, a obrona za pomocą „Myślę, że było to domniemane” nie jest argumentem. Nikt nie pytał o tablice klient / serwer, chodziło o tablicę wierzchołków w najszerszym znaczeniu, w porównaniu do VBO. Przy okazji, nie powiedziałem nic o VAO, skąd ten pomysł?
11

(Dodam to tutaj ze względu na fakt, że odpowiedź ChrisE jest bardzo niejednoznaczna, co niestety wynika z niejasności pierwotnego pytania. Zakładam jednak, że pytanie OP powinno brzmieć „kiedy należy używać VAO i kiedy używać VBO ”.)

V ertex B uffer O bjects (które tak naprawdę nie różnią się od innych typów B uffer O bjects , na przykład U niform B uffer O bjects ) umożliwiają przesyłanie danych wierzchołków do sprzętu graficznego.

V Ertex rray O bjects są wykorzystywane w uzupełnieniu do VBO s w celu poprawy po stronie klienta (CPU-side) wydajności, poprzez zmniejszenie liczby połączeń potrzebnych do ponownie powiązać poszczególne bufory wierzchołków i ponownie zbiór wierzchołków atrybuty każdym razem, gdy chcesz zmień, aby renderować w określony sposób. Zamiast robić wszystko, co działa na każdej ramce, robisz to raz (przy inicjalizacji), a następnie po prostu ponownie powiąż odpowiedni VAO dla każdego (zestawu) wywołań rysujących, które używają powiązanych atrybutów wierzchołków.

Mimo to korzystanie z VAO nie zwalnia cię z dodatkowej odpowiedzialności za zrobienie glBindBuffer+ glBufferDataza wszelkie dane zmieniające każdą klatkę, na przykład pozycje jednostek gry / rotacje / matryce transformacji. Tylko wtedy, gdy masz całkowicie statyczne dane, wystarczy glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)je wyrenderować.

Inżynier
źródło
+1 VAO to okropne i mylące imię, które zawsze przypomina mi o bałaganie openGL.
concept3d
1
Pamiętam też, że uczestniczyłem w dyskusji dotyczącej tego pytania (większość z nich została usunięta). Ponownie problem tkwi w okropnej terminologii OpenGL. Zredagowałem również odpowiedź Chrisa, aby była bardziej dokładna.
concept3d