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?
Odpowiedzi:
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).
źródło
(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
+glBufferData
za wszelkie dane zmieniające każdą klatkę, na przykład pozycje jednostek gry / rotacje / matryce transformacji. Tylko wtedy, gdy masz całkowicie statyczne dane, wystarczyglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
je wyrenderować.źródło