Коли використовувати масив вершин і коли використовувати VBO?


14

Я намагаюся дізнатися про вершинні масиви та об’єкти вершинних буферів , але я не розумію відмінності в термінах:

  • випадок використання (статична геометрія, як місцевість, геометрія, яка змінює кожен кадр, як система частинок тощо)
  • виконання
  • портативність (стара відеокарта, консолі, пристрої типу Android або iPhone тощо)

деякі уточнення?


3
Для тих , хто ще , що прибув сюди, щоб переглянути самі голосував відповідь тут .... stackoverflow.com/questions/430555 / ...
afuzzyllama

Відповіді:


14

Ось гідний запис про VBO.

Продуктивність

Ось хороший огляд виклику семантики.

Ось ще один хороший огляд проблем ефективності; в ній ми бачимо, що VBO є більш ефективними, ніж масиви.

Причина, яку ми віддаємо перевагу VBO, полягає в тому, що дані завантажуються на карту, і тому вам не доведеться передавати їх кожен кадр. Залежно від типу створеного VBO, ви можете давати підказки графічному драйверу щодо використання (write-many, read-many vs. write-many, never-read тощо).

Використання

VBO справді хороші для статичної геометрії, як місцевість, яку ви не сподіваєтесь змінити, або для встановленої геометрії.

Вершинні масиви корисні для даних, які часто змінюються, але вони також читаються хост-машиною - так, для прямого відображення даних, якими маніпулюють (наприклад, буфери даних лазерного далекомера, там, де я їх використовував), часто. Якщо ви можете піти від того, щоб ніколи не читати дані на хост-пристрої (тому просто висунувши їх на карту), VBO в режимі лише для запису - хороший варіант.

Переносність

Клієнтські вершинні масиви клієнтів. Вони доступні у OpenGL до 3.0, застарілі в 3.0 та перейшли у версію 3.1+. OpenGL ES підтримує їх (OpenGL ES 2 ні).

VBOs доступні після OpenGL 1.5. Це єдиний спосіб зберігання геометричних даних у OpenGL ES 2 (і так, WebGL).


2
У цьому PerformanceTuning.pdf сказано, що VBOs "може зашкодити продуктивності в неоптимальних випадках" ... але це не є складним. Будь-яка ідея, що це за справи? У мене є випадок, коли мені потрібно оновлювати геометрію кожного кадру, тому мені цікаво, чи буде масив вершин у цьому випадку кращим чи гіршим, ніж VBO. Дякую.
sidewinderguy

1
читайте opengl.org/sdk/docs/man/xhtml/glDrawElements.xml та opengl.org/wiki/GlDrawElements - Вершинні масиви AREN'T застаріли і не видаляються, вони все ще підтримуються як OpenGL 4.x;

1
@vaxquis Клієнтські вершинні масиви застаріли. Вершинні масиви на сервері не є. VAO - це різна річ і призначена для економії стану. У пості нічого не було, хоча це може бути більш точним, якщо це буде сторона клієнта. Але я гадаю, що це було неявно.
concept3d

1
"Клієнтські вершинні масиви застарілі. Масиви вершин на стороні сервера немає". "Вершинні масиви. Вони доступні у OpenGL до версії 3.0, застарілої версії 3.0 та відсутній у версії 3.1+." "Ви можете заздалегідь уточнити окремі масиви вершин (...) і використовувати їх для побудови послідовності примітивів за допомогою одного виклику glDrawElements. Core у версії 4.4" - Я бачу суперечність у цих твердженнях.

2
Плюс, перш ніж сказати щось "застаріло", вкажіть джерело такої заяви, бажано в офіційному документі. Вказівка ​​від StackExchange до StackOverflow як доказ НЕ є тим, як працює наука, і захищати "Я гадаю, що це було неявно" - це не аргумент. Ніхто не питав про масив клієнт / сервер, питання про масив вершин у найширшому розумінні, порівняно з VBO. До речі, я нічого не сказав про VAO, звідки ця ідея?

11

(Я додаю це сюди через те, що відповідь ChrisE дуже неоднозначна, що, на жаль, пов’язано з неоднозначністю початкового питання. Однак я припускаю, що питання ОП повинно було мати назву "коли використовувати VAO і коли використовувати VBO ".)

V ertex B uffer O bjects (які насправді не відрізняються від інших типів B uffer O bjects, наприклад U niform B uffer O bjects) забезпечують засоби для завантаження вершинних даних в графічному обладнанні.

V ertex rray O bjects використовуються на додаток до ВБО з метою поліпшення на стороні клієнта (ЦП стороні) продуктивність, за рахунок зменшення числа викликів , необхідних для пересвязать окремих буферів вершин і повторно встановити вершину атрибутів кожен раз , коли ви хочете змінити, щоб відобразити певним чином. Замість того, щоб робити все, що працює на кожному кадрі, ви робите це один раз (при ініціалізації), а потім просто перев’язуєте відповідний VAO для кожного (набору) викликів для малювання, які використовують пов'язані атрибути вершин.

Незважаючи на це, використання VAO не звільняє вас від додаткової відповідальностіglBindBuffer + glBufferDataза будь-які дані, що змінюють кожен кадр, наприклад, матриці позицій / обертань / перетворення суб'єктів гри. Лише тоді, коли у вас є повністю статичні дані, потрібно лише зробити glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)їх.


+1 VAO - жахливе і заплутане ім'я, і ​​воно мені завжди нагадує про те, що стало безладом openGL.
concept3d

1
Я також пам’ятаю, що йшов із обговоренням цього питання (більшість його було видалено). Знову ж таки проблема полягає в жахливій термінології OpenGL. Я також відредагував відповідь Кріса, щоб бути більш точним.
concept3d
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.