Ответ 1
Вершинный массив - это просто некоторые данные в вашей программе (внутри вашего адресного пространства), о которых вы сообщаете OpenGL, указав на нее указатель.
Хотя они более эффективны, чем индивидуально, каждая из них имеет проблемы с производительностью. GL должен сделать копию в то время, когда вы вызываете DrawElements (или аналогичную функцию), потому что это единственный раз, когда можно быть уверенным, что данные действительны (в конце концов, ничто не мешает вам переписать данные сразу). Это означает, что существует существенное препятствие для parallelism и, следовательно, проблема с производительностью.
Объекты буфера вершин ( "буферы вершин" ) являются необработанными блоками данных, которые у вас нет, т.е. они не находятся в вашем адресном пространстве. Вы можете либо скопировать данные в буферный объект с помощью Копировать (Sub) Data, либо временно привязать его к вашему адресному пространству. Как только вы отмените выбор буфера, он больше не принадлежит вам. Огромное преимущество заключается в том, что теперь GL может решить, что с ним делать, и когда загрузить его. Он знает, что данные будут действительны, потому что вы не можете получить к нему доступ. Это делает CPU/GPU parallelism намного проще.
Вершины массива abjects являются немного неправильным. В них нет вершин или массивов. Это всего лишь своего рода "блок описания состояния", который инкапсулирует привязки одного или нескольких объектов буфера вершин (включая любые вызовы VertexAttribPointer). Таким образом, они являются удобной функцией и несколько более эффективными (меньше вызовов функций), но не обязательно. Вы можете делать все, что делает VAO вручную.