glDrawElements期间nvoglv64.dll中的访问冲突

时间:2018-05-25 10:39:02

标签: c++ opengl nvidia access-violation

我有一些构建顶点数组对象(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来电。

0 个答案:

没有答案