Нарушение прав доступа в nvoglv64.dll во время glDrawElements - PullRequest
0 голосов
/ 25 мая 2018

У меня есть некоторый исходный код, который строит объект массива вершин (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-моделей.Внезапно я получаю следующую ошибку:

Исключение, выданное по адресу 0x0000000053C91A02 (nvoglv64.dll) в application.exe: 0xC0000005: Местоположение чтения нарушения доступа 0x0000000000000000.

И это можно исправить, вызвав следующий код вместо 2-строчного кода выше:

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 вызовы не должны быть необходимыми.

...