Во время каждого вызова glDrawElements мой графический драйвер аварийно завершает работу / останавливается и восстанавливается через несколько секунд (обнаружение / восстановление таймаута Windows 7). glGetError () всегда возвращает GL_NO_ERROR.
Редактировать: Просто чтобы понять, что именно происходит: при первом вызове glDrawElements мой компьютер зависает на 5-10 секунд, затем экран становится черным еще на несколько секунд, затем восстанавливается, и Windows выдает мне сообщение : "Драйвер дисплея перестал отвечать и был восстановлен". Моя программа продолжает работать, но она застряла в glDrawElements.
Обновление : добавление вызова glFlush () непосредственно перед тем, как glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) заставит его работать. Я не понимаю почему.
Вот мой код, несколько упрощенный и без проверки ошибок. Я что-то делаю не так?
struct Vertex
{
float pos[3];
float color[3];
};
struct Tri
{
unsigned int idxs[3];
};
// ...
GLuint m_vbo;
GLuint m_ibo;
std::vector<Vertex> m_verts;
std::vector<Tri> m_faces;
// ...
glGenBuffers(1, &m_vbo);
Vertex* vBuf = &(m_verts[0]);
unsigned int vboSize = sizeof(vBuf[0]) * m_verts.size();
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, vboSize, vBuf, GL_STATIC_DRAW);
glGenBuffers(1, &m_ibo);
unsigned int* iBuf = (unsigned int*) (&(m_faces[0]));
unsigned int iboSize = sizeof(iBuf[0]) * (m_faces.size() * 3);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, iboSize, iBuf, GL_STATIC_DRAW);
// ...
// this line fixes it
// glFlush();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(someShaderProgram);
// ...
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
// the attribute locations are queried using glGetAttribLocation in the real code
glEnableVertexAttribArray(1);
glVertexAttribPointer
(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(0));
glEnableVertexAttribArray(0);
glVertexAttribPointer
(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(3*sizeof(float)));
// doesn't get past this line
glDrawElements(GL_TRIANGLES, m_faces.size()*3, GL_UNSIGNED_INT, 0);
// ...
glfwSwapBuffers();