Каждый прототип объекта имеет следующую функцию, вызываемую в начале основной функции.
Код: Выделить всё
void initTreePrototype()
glGenBuffers (1, &treeVBO); //create vbo for vertices
glGenBuffers (1, &treeIBO); //create vbo for vertice indices
glGenVertexArrays (1, &treeVAO); //create vao for the prototype
glVertexArrayAttribFormat(_treeVAO, 0, 4 * sizeof(float), GL_FLOAT, GL_FALSE, 0); //set format of vao
... //load obj file
glNamedBufferData(treeEBO, treeEBOLen * sizeof(GLuint), treeVertIdx, GL_STATIC_DRAW); //send vertex indices to gpu
glNamedBufferData(treeVBO, vertPool.size() * sizeof(glm::vec4), treeVertices, GL_STATIC_DRAW); //send vertices to gpu
}
Код: Выделить всё
void displayTriangles(const glm::mat4& tr, GLuint vao, GLuint arrBuf, GLuint idxBuf, unsigned len, const glm::vec4& color) {
glBindVertexArray(vao);
//bind ebo to vao
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idxBuf);
glEnableVertexAttribArray(0);
//bind vbo to vao
glBindVertexBuffer(0, arrBuf, 0, sizeof(glm::vec4));
glVertexAttribBinding(0, 0);
//send uniforms
glUniformMatrix4fv(1, 1, GL_TRUE, &tr[0][0]);
glUniform4f(2, color[0], color[1], color[2], color[3]);
glDrawElements(GL_TRIANGLES, len, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
}
Несмотря на это, приведенный выше код дает сбой, что приводит к сбою игры еще до того, как что-либо будет нарисовано.
Я пробовал разные варианты порядок строк в приведенном выше коде. Ни один из них не работал. Хотя было несколько примеров использования glvertexattribpointer(), мне не удалось найти код, использующий glVertexArrayAttribFormat().
Я думаю, что glvertexattribpointer() требует vbo для format vao, поэтому его следует вызывать каждый раз при привязке vbo, тогда как glVertexArrayAttribFormat() нужно вызывать только один раз при создании vao.
Подробнее здесь: https://stackoverflow.com/questions/784 ... bo-and-vao