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