Подтвердить что ты не робот

Путаница буфера вершин OpenGL

Может кто-нибудь объяснить разницу между VertexBuffer, VertexArray, VertexBufferObject и VertexArrayObject? Я даже не уверен, что это все термины для разных вещей, но я видел, как все они появляются в спецификации OpenGL.

Я знаю, что VertexBuffer просто содержит вершины и ничего больше, после привязки, и как только я установил указатели вершин, я могу использовать DrawArrays для его рисования. Я делал это так много раз.

Я использую то, что я думаю, это VertexArray, в котором хранится состояние всех установленных буферов вершин, а также любые указатели вершин. Связывание VertexArray автоматически связывает буфер вершин и устанавливает указатели вершин. Я тоже использовал это (в основном).

Но что такое объект VertexBufferObject и объект VertexArrayObject? Они лучше? Разве VertexArray не дает мне все, что мне нужно?

4b9b3361

Ответ 1

Вершинный массив - это просто некоторые данные в вашей программе (внутри вашего адресного пространства), о которых вы сообщаете OpenGL, указав на нее указатель.
Хотя они более эффективны, чем индивидуально, каждая из них имеет проблемы с производительностью. GL должен сделать копию в то время, когда вы вызываете DrawElements (или аналогичную функцию), потому что это единственный раз, когда можно быть уверенным, что данные действительны (в конце концов, ничто не мешает вам переписать данные сразу). Это означает, что существует существенное препятствие для parallelism и, следовательно, проблема с производительностью.

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

Вершины массива abjects являются немного неправильным. В них нет вершин или массивов. Это всего лишь своего рода "блок описания состояния", который инкапсулирует привязки одного или нескольких объектов буфера вершин (включая любые вызовы VertexAttribPointer). Таким образом, они являются удобной функцией и несколько более эффективными (меньше вызовов функций), но не обязательно. Вы можете делать все, что делает VAO вручную.

Ответ 2

  • BufferObject: выделенный буфер памяти
    • Объект буфера вершин: объект BufferObject, содержащий информацию о вершинах (цвета, положение, пользовательские данные, используемые шейдером,...)
    • Объект Pixel Buffer: объект BufferObject, содержащий информацию о пикселях или текселе. В основном используется для загрузки текстур.
    • Элемент Buffer Object: буфер BufferObject, содержащий индексы (используется glDrawElements).
  • Vertex Array: память, используемая gl * Указатель. Может быть память хоста или объект буфера вершин, если он связан с помощью glBindBuffer с GL_ARRAY_BUFFER.
  • Элемент Array: память, используемая вызовом glDrawElements. Может быть память хоста или объект Buffer Element, если он связан с помощью glBindBuffer с GL_ELEMENT_ARRAY_BUFFER.