Вы прикрепляете данные индекса к vao (объекты массива вершин)?

Я понимаю, что с VAO идеально подходит для предоставления всех данных атрибутов, таких как нормали вершин, положения вершин, цвета вершин, координаты текстуры и т. д., Но как насчет данных индекса в ситуациях для рисования с помощью drawElements, а не drawArrays?

Пока я создаю VAO и предоставляю данные выше, но не знаю, как прикрепить данные индексного буфера к VAO (если это даже рекомендуется или возможно).

1
0
953
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Никакие данные какого-либо буфера не хранятся в объекте массива вершин. Объект массива вершин просто собирает информацию о том, как «использовать» данные разных буферов. Он знает такие вещи, как формат данных, тип, смещение шага и имена буферов, но он не «отражает» данные, которые хранятся в объектах буфера.

Имя названного объекта буфера элемента - это состояние вектора состояния объектов массива вершин.

Это означает, что в объекте массива вершин нет данных. Индексы хранятся в буфере элементов, но имя (целое число объекта) индексного буфера указывается в объекте массива вершин.

GL_ELEMENT_ARRAY_BUFFER должен быть привязан после привязки объекта массива вершин (glBindVertexArray). Объект GL_ELEMENT_ARRAY_BUFFER хранится в векторе состояния объектов массива вершин. Если объект массива вершин был освобожден и снова привязан, значит, GL_ELEMENT_ARRAY_BUFFER известен и снова привязан. Но если буфер массива элементов явно становится несвязанным, в то время как объект массива вершин связан, он удаляется из вектора состояния.

См. Спецификация OpenGL ES 3.0.5 - 2.11 Объекты массива вершин, стр.:

A vertex array object is created by binding a name returned by GenVertexArrays with the command

void BindVertexArray( uint array );

array is the vertex array object name. The resulting vertex array object is a new state vector, comprising all the state and with the same initial values listed in table 6.2.
BindVertexArray may also be used to bind an existing vertex array object. If the bind is successful no change is made to the state of the bound vertex array object, and any previous binding is broken.

Tables 6.2, Vertex Array Object State
VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE, VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE, VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_INTEGER, VERTEX_ATTRIB_ARRAY_DIVISOR, VERTEX_ATTRIB_ARRAY_POINTER, ELEMENT_ARRAY_BUFFER_BINDING, VERTEX_ATTRIB_ARRAY_BUFFER_BINDING.


I'm curious whether index buffer object data or uniforms would be somehow stored inside of VAOs? Uniforms are stored to the default uniform block which belongs to the program object.

Униформы сохраняются в унифицированном блоке по умолчанию, который принадлежит объекту программы, нет никакого отношения к объекту массива вершин.

Да, я понимаю привязку и отключение этих атрибутов. Мне любопытно, будут ли как-то храниться данные объекта буфера индекса или униформа внутри VAO? Я спрашиваю, потому что кажется, что VAO инкапсулируют функциональность для определенного объекта. Учитывая, что IBO (объекты буфера индекса) также инкапсулируют это для одного объекта, почему бы не сделать это каким-то образом внутри VAO? Это возможно? Если так, то как ты это делаешь? Спасибо!

Detuned 26.10.2018 08:15

@Detuned Я расширил ответ.

Rabbid76 26.10.2018 08:29

Похоже, что VAO - это просто инструкции, а не данные. Если это так, то данные индексов туда не попадают, потому что нет «инструкций» по извлечению данных. Это просто вызов привязки и рисования с drawElement. Это верно?

Detuned 26.10.2018 08:37

@Detuned Да, объекты массива вершин состоят из таблиц. В этих таблицах содержатся ссылки на буферные объекты и информация, какой буфер использовать для какого атрибута. Индексный буфер - это единственная ссылка. В VAO нет индекса или значения атрибута.

Rabbid76 26.10.2018 08:40

Другие вопросы по теме