Ця термінологія входить в історію OpenGL. Важливо пам’ятати, що для більшості версій GL, які є актуальними тут, OpenGL розвивався поступово і додаючи нову функціональність до вже існуючого API, а не змінюючи API.
Перша версія OpenGL не мала жодного з цих типів об'єктів. Малювання було досягнуто шляхом видачі декількох викликів glBegin / glEnd, і однією з проблем цієї моделі було те, що вона була дуже неефективною, з точки зору накладних викликів функцій.
OpenGL 1.1 зробив перші кроки для вирішення цього питання, ввівши вершинні масиви. Замість того, щоб безпосередньо вказувати дані вершини, тепер ви можете їх джерело з масивів C / C ++ - звідси і назва. Отже, вершинний масив - це саме те - це масив вершин і стан GL, необхідний для їх визначення.
Наступна основна еволюція відбулася з GL 1.5 і дозволила зберігати дані вершинного масиву в пам'яті GPU, а не в системній ("клієнтській") пам'яті. Слабкою специфікацією вершинного масиву GL 1.1 було те, що повний набір вершинних даних повинен був передаватися GPU кожен раз, коли ви хотіли ним користуватися; якби це вже було на GPU, то цього перенесення можна було б уникнути та досягти потенційного підвищення продуктивності.
Так створено новий тип об'єкта GL, який дозволяє зберігати ці дані в GPU. Так само, як текстурний об'єкт використовується для зберігання текстурних даних, об’єкт вершинного буфера зберігає дані вершини. Це насправді лише окремий випадок більш загального типу об'єкта буфера, який може зберігати неспецифічні дані.
API для використання вершинних буферних об'єктів був підкріплений на вже існуючих вершинах API масивів вершин, тому ви бачите дивні речі, такі як перетворення зміщення байтів у покажчики в ньому. Отже, тепер у нас є вершинний масив API, який просто зберігає стан, дані отримуються з буферних об'єктів, а не з масивів пам'яті.
Це доводить нас майже до кінця нашої історії. Отриманий API був досить багатослівним, коли мова зайшла про вказівку стану вершинного масиву, тому інший шлях оптимізації полягав у створенні нового типу об'єкта, який збирав би весь цей стан разом, дозволяв кілька змін стану вершинного масиву в одному виклику API та дозволяв GPU потенційно здійснювати оптимізацію через те, що зможеш знати, який стан буде використаний достроково.
Введіть об’єкт вершинного масиву, який збирає все це разом.
Отже, підводячи підсумок, вершиновий масив розпочав життя як сукупність стану та даних (що зберігаються в масиві) для малювання. Буфер вершин замінює зберігання масиву в пам'яті з типом об'єкта GL, залишаючи масив вершин просто бути станом. Об'єкт масиву вершин просто об'єкт - контейнер для цього стану, що дозволяє йому бути змінений легше і з меншою кількістю викликів API.
char* buffer = socketRead();
(псевдокод). З іншого боку, журнал проживає весь життєвий цикл програми. Таким чином, ви десь створюєте масив і починаєте читати сокет, щоразу, коли ви отримуєте дані, які ви записуєте цей фрагмент до масиву, надаючи чіткий список усіх отриманих даних.