OpenGL 3.x — glBindBuffer (GL_ELEMENT_ARRAY_BUFFER) и VAO

У меня есть метод для инициализации моего VBO / VAO:

        glBindBuffer(GL_ARRAY_BUFFER, mVBO_VertexShader);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);// setup VAO
glBindVertexArray(mVAO);

glBindBuffer(GL_ARRAY_BUFFER, mVBO_VertexShader);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

А потом отдельный метод для рисования;

    glBindVertexArray(mVAO);
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_SHORT, &mIndexBuffer);
glBindVertexArray(0);

Нужно ли отстегивать GL_ELEMENT_ARRAY_BUFFER после моего звонка glDrawElements или его состояние «связано» с ВАО? (Так что, если я отвяжу ВАО, GL_ELEMENT_ARRAY_BUFFER тоже будет несвязанным)?

3

Решение

GL_ELEMENT_ARRAY_BUFFER привязан к государству ВАО. Я цитирую спецификацию OpenGL 3.3: «Полученный объект массива вершин представляет собой новый вектор состояний, включающий все значения состояний, перечисленные в таблицах 6.4 и 6.5». Таблица 6.4 содержит ELEMENT ARRAY BUFFER BINDING, Так что нет, вам не нужно это связывать.

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

7

Другие решения

Свяжите свой массив вершин, когда вы установите указатель атрибута вершины.
Так что в основном просто не отсоединяйте ваш массив вершин, поскольку у вас есть только один.

0

По вопросам рекламы [email protected]