2015-11-11 3 views
1

Я знаю, что VAOs хранят настройки атрибутов вершины и связанные объекты буфера, но я не уверен, какой правильный порядок привязки-разворота я должен делать. Правильно ли следующий порядок?Порядок привязки объектов массива Vertex

glBindVertexArray(vao); //bind vao 

glBindBuffer(GL_ARRAY_BUFFER, vbo); //bind vbo 
glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * vertices.size(), vertices.data(), GL_STATIC_DRAW); 
glVertexAttribPointer(vertex_index, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(vertex_index); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); //bind ebo 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(), indices.data(), GL_STATIC_DRAW); 

glBindVertexArray(0); //unbind vao 
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind vbo 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //unbind ebo 

На данный момент, это код, я использую, и она работает, но я пришел к этому после многих попыток, так что я хочу быть уверен, что это правильный путь.

ответ

3

GL_ARRAY_BUFFER может быть несвязано сразу после glEnableVertexAttribArray/glVertexAttribPointer, поскольку привязка хранится этими двумя функциями. Отвязывание его впоследствии больше не отмечено ВАО.

Поскольку всегда существует только один GL_ELEMENT_ARRAY_BUFFER, VAO хранит последнее состояние связывания этого типа буфера. Таким образом, буфер индекса должен быть привязан до момента, когда VAO становится несвязанным.

Ваш код полностью применим. Вы можете переместить GL_ARRAY_BUFFER, отперев некоторые строки вверх, но это не требуется.

+0

В моем коде хранится один vbo и один ebo на vao. Может ли быть более эффективным? Каждая сетка, вершины которой загружаются в vbo, также имеет массив индексов. Обратите внимание, что каждый vbo использует те же настройки glVertexAttribPointer(). – Pilpel

+1

Еще один второстепенный предмет, который можно было бы упомянуть: разблокировка 'GL_ELEMENT_ARRAY_BUFFER' в конце является избыточным. Поскольку это связывание является частью состояния VAO, оно больше не будет на месте после того, как VAO будет отключено. –

+0

Почему EBO ведут себя иначе, чем VBOs? Одновременно может быть только один VBO, как и EBO. – Pilpel