glDrawElements崩溃

问题描述:

在每次调用glDrawElements期间,我的图形驱动程序崩溃/冻结并在几秒后恢复(Windows 7超时检测/恢复)。 glGetError()总是返回GL_NO_ERROR。glDrawElements崩溃

编辑:只要清楚发生了什么:第一次调用glDrawElements,我的电脑冻结5-10秒,然后屏幕再黑几秒钟,然后恢复,Windows给我一个消息:“显示驱动程序停止响应并已恢复”。我的程序继续运行,但它卡在glDrawElements中。

更新:在glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)使其工作之前添加对glFlush()的调用。我不明白为什么。

这是我的代码,有点简单,没有错误检查。我做错了什么?

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(); 

glVertexAttribPointer最后一个参数是“第一成分的偏移量” - (!)字节。你确定你想要价值3吗?

+0

它不是以字节为单位的大小,它是从缓冲区开始的偏移量。 – 2012-03-04 00:30:43

+0

这就是我想说的,但偏移量是以字节给出的,所以3的值似乎不太可能。这确实是模棱两可的。 – cooky451 2012-03-04 00:43:18

+0

谢谢。它应该是3 * sizeof(float)那么,对吧?我会编辑我的帖子来解决这个问题。它仍然不能解决原来的问题。 – KTC 2012-03-04 00:48:50