Найправильніша відповідь - це залежить від того, як ви її запрограмуєте, але це непогано потурбуватися. У той час як GPU стали неймовірно швидкими, пропускна здатність до та від GPU RAM не є, і буде вашим найприємнішим вузьким місцем.
Чи надсилаються його дані в пам'ять GPU лише один раз і сидять там назавжди?
Сподіваюсь, так. Для швидкості візуалізації ви хочете якомога більше даних сидіти на графічному процесорі, замість того, щоб повторно надсилати їх кожен кадр. VBO служать саме цій цілі. Існують як статичні, так і динамічні VBO, перші найкращі для статичних моделей, а другі найкращі для моделей, вершини яких змінять кожен кадр (скажімо, система частинок). Навіть якщо мова йде про динамічні VBO, то ви не хочете повторно відправляти всі вершини кожного кадру; тільки ті, що змінюються.
У випадку вашої будівлі дані вершини просто сидітимуть там, і єдине, що змінюється - це ваші матриці (модель / світ, проекція та вид).
Що стосується системи частинок, я зробив динамічний VBO досить великий, щоб зберігати максимальну кількість частинок, які коли-небудь існуватимуть для цієї системи. Кожен кадр я надсилаю дані для частинок, що випромінювали цей кадр, разом із паровою формою, і це все. Коли я малюю, я можу вказати початкову та кінцеву точку в цьому VBO, тому мені не потрібно видаляти дані про частинки. Я можу сказати, що не малюйте.
Коли модель фактично візуалізується кожен кадр, чи повинні процесори GPU кожного разу отримувати його дані з пам'яті GPU? Що я маю на увазі - якщо б у мене було дві моделі, відображені кілька разів у кожній - було б важливо, якщо я першу зробив кілька разів, а потім другу кілька разів, чи першу я створив лише один раз, другу - один раз і продовжували переплутати це так?
Дія надсилання декількох розіграшів замість одного лише набагато більша межа. Перевірте інстальовану візуалізацію; це може допомогти вам багато чого і зробити відповідь на це питання марною. У мене були деякі проблеми з драйверами, які я ще не розробив, але якщо ви можете працювати, тоді проблема вирішена.
Очевидно, що відеокарти мають обмежену оперативну пам’ять - коли вона не може вмістити всі дані моделі, необхідні для візуалізації 1 кадру, я думаю, вона зберігає (деякі) це з оперативної пам'яті процесора кожного кадру, це правильно?
Ви не хочете, щоб не вистачало пам’яті GPU. Якщо ви це зробите, то змініть речі, щоб цього не зробити. За самим гіпотетичним сценарієм, який у вас закінчується, він, мабуть, зазнає краху, але я ніколи не бачив, щоб це сталося, я, чесно кажучи, не знаю.
Я забув зробити одне розрізнення: там надсилаються дані в GPU і є налаштування / прив'язка буферів як поточних. Чи викликає останній потік даних?
Ні якого значного потоку даних, ні. На це є певна вартість, але це справедливо для кожного рядка коду, який ви пишете. Знову дізнайтеся, скільки це коштує вам, знову ж таки, що таке профілювання.
створення буфера з ініціалізацією
Відповідь Раксвана звучить добре, але це не зовсім точно. У OpenGL створення буфера не залишає місця. Якщо ви хочете зарезервувати місце, не передаючи жодних даних, ви можете зателефонувати на glBufferData і просто пропустити null. (Див. Розділ приміток тут .)
оновлення даних буфера
Я здогадуюсь, ви маєте на увазі glBufferData або інші подібні функції, правда? Тут відбувається реальна передача даних. (Якщо ви не пропустите нуль, як я щойно сказав в останньому абзаці.)
прив'язування буфера до активного (чи це просто спосіб сказати API, що я хочу, щоб цей буфер був наданий під час наступного виклику розіграшу, і він нічого не робить сам по собі?)
Так, але це може зробити трохи більше, ніж це. Наприклад, якщо ви прив'язуєте VAO (об'єкт вершинного масиву), то прив'язуєте VBO, що VBO стає прив’язаним до VAO. Пізніше, якщо ви знову зв’яжете це VAO і зателефонуєте glDrawArrays, він буде знати, що VBO малювати.
Зауважте, що хоча у багатьох навчальних посібниках буде створено VAO для кожного VBO, мені сказали, що це не їх призначення. Нібито ви повинні створити один VAO і використовувати його для кожного VBO, який має однакові атрибути. Я ще цього не пробував, тому не можу точно сказати, чи краще, чи гірше.
API виклику
Що тут відбувається досить просто (з нашої точки зору). Скажімо, ви зв’язуєте VAO, а потім викликаєте glDrawArrays. Ви вказуєте початкову точку і кількість, і вона запускає вашу вершинну шейдер для кожної вершини в цьому діапазоні, яка, в свою чергу, передає свої результати вниз по лінії. Цей весь процес є ще одним власним нарисом.