今天在實現《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是一個好習慣。