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是一個好習慣。

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