glDrawElements崩溃的一种可能原因

今天在实现《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是一个好习惯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章