今天在实现《OpenGL编程指南》第三章的例子时,出现在调用glDrawElements
时崩溃的问题,试验后,发现原来是没有绑定EBO。
出现崩溃时的例子源码如下:
void init()
{
...
glGenVertexArrays(1, &g_VAO);
glBindVertexArray(g_VAO);
glGenBuffers(1, &g_VBO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_positions), vertex_positions);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertex_positions), sizeof(vertex_colors), vertex_colors);
...
}
void display()
{
...
// DrawArrays
model_matrix = vmath::translate(-3.0f, 0.0f, -5.0f);
glUniformMatrix4fv(g_modelMatrixLoc, 1, GL_FALSE, &model_matrix[0][0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
// DrawElements
model_matrix = vmath::translate(-1.0f, 0.0f, -5.0f);
glUniformMatrix4fv(g_modelMatrixLoc, 1, GL_FALSE, &model_matrix[0][0]);
// 调用以下方法时崩溃
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL);
...
}
在 // DrawArrays
前添加
glBindVertexArray(g_VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_EBO);
后,程序即可正常。
事实上,除了所示的init()
代码段外,程序其他部分并未对VAO和EBO进行显式操作,按理说VAO和EBO应该一直处于绑定状态才对,或许是某些操作隐式地影响了VAO和EBO的绑定吧。
所以说,在绘制前先显式地绑定一下所用到的VAO和EBO是一个好习惯。