glDrawElements 崩溃

Posted

技术标签:

【中文标题】glDrawElements 崩溃【英文标题】:glDrawElements crashing 【发布时间】:2012-03-04 00:15:07 【问题描述】:

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

编辑:只是为了弄清楚到底发生了什么:第一次调用 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();

【问题讨论】:

【参考方案1】:

glVertexAttribPointer 的最后一个参数是“第一个组件的偏移量” - 以字节(!)为单位。你确定你想要那个值3吗?

【讨论】:

不是字节大小,而是从缓冲区开始的偏移量。 这就是我想说的,但是偏移量是以字节为单位给出的,所以值 3 似乎不太可能。它确实是模棱两可的。 谢谢。那么它应该是 3*sizeof(float) ,对吧?我会编辑我的帖子来解决这个问题。但它仍然不能解决原来的问题。 我现在看不到任何其他错误,除了如果结构比你想象的要大它会崩溃,你测试了吗? (只要 sizeof(TRI) 是 3*sizeof(unsigned) 就试试) 你使用的 faces 和 iBuf 变量是什么?

以上是关于glDrawElements 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:glDrawElements 不绘制

使用 glDrawElements 很难理解索引

elementplus 引入table后页面崩溃

glDrawElements中的index参数是啥意思?

OpenGL ES - glDrawElements - 无法理解索引

我不明白的 glDrawElements 的使用