我有一些构建顶点数组对象(VAO)的源代码,如下所示:
GLuint vao{ 0 };
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, mesh.m_vertex_data_vbo_id);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.m_indices_vbo_id);
// multiple calls to glVertexAttribPointer for positions, normals, etc.
glVertexAttribPointer(0, static_cast<GLint>(mesh.m_position_size / sizeof(GLfloat)), GL_FLOAT, GL_FALSE, static_cast<GLsizei>(mesh.m_size_one_vertex), reinterpret_cast<GLvoid*>(mesh.m_position_offset));
...
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
之后,在渲染网格时,以下代码被调用:
glBindVertexArray(vao);
glDrawElements(mode, mesh.indices_length(), GL_UNSIGNED_INT, nullptr);
此代码曾用于工作多年,适用于各种不同的3D模型。现在,突然间,我收到以下错误:
application.exe中的0x0000000053C91A02(nvoglv64.dll)抛出异常:0xC0000005:访问冲突读取位置0x0000000000000000。
可以通过调用以下代码而不是上面的2-liner来修复它:
glBindVertexArray(vao);
// glBindBuffer(GL_ARRAY_BUFFER, mesh.m_vertex_data_vbo_id); // not required for the fix
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.m_indices_vbo_id); // Adding this line gets rid of the exception
glDrawElements(mode, mesh.indices_length(), GL_UNSIGNED_INT, nullptr);
为什么呢?我的理解不应该glBindBuffer
来电。