glDrawElements闪烁和崩溃

时间:2009-12-05 19:29:48

标签: visual-c++ opengl nvidia

使用glDrawElements()时,我遇到了一个可疑的错误。我正在尝试渲染简单的图元(主要是矩形)以加快文本的绘制等等,但是当我调用glDrawElements()时,整个屏幕闪烁黑色(不仅仅是我的窗口区域)一帧左右。下一帧它变回与以前相同的“Windows颜色”。所以它闪烁了几秒钟,最后在一个消息框中说

The NVIDIA OpenGL Driver encountered an unrecoverable error
and must close this application.

Error 12

在调用glDrawElements()之前,我是否需要重置GL的设置?我知道这不是一些悬空的glEnableClientState(),我检查了它(我曾经有过其中一个,但后来glDrawElements()崩溃了。)

想到它,它几乎看起来像一些后台缓冲区错误...有什么想法尝试?

2 个答案:

答案 0 :(得分:5)

显然你正在混合VBO模式和VA模式。这是完全可能的,但必须谨慎使用。

致电时:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

这意味着下次使用glDrawElements(..., ..., ..., x)渲染时,它将使用x作为索引数据的指针,最后一次调用glVertexPointer指向顶点数据。

如果取消绑定当前的VBO和IBO(使用上面两个glBindBuffer调用),这意味着当使用相同的glDrawElements进行渲染时,x将用作索引的偏移量IBO中的数据 ,最后一次调用glVertexPointer作为VBO 中顶点数据的偏移量。

根据x和glVertexPointer的值,您可以使驱动程序崩溃,因为偏移超出范围和/或基础数据的类型错误(NaN)。

为了回答你的问题,用VBO模式绘制然后用VA模式绘图:

  1. 取消绑定当前的VBO
  2. 取消绑定当前的IBO
  3. 使用glVertexPointer
  4. 指定正确的顶点地址
  5. 使用glDrawElements
  6. 指定正确的索引地址

    然后就可以了。

答案 1 :(得分:0)

呸!找到了。当我做的时候

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

在渲染闪烁+崩溃停止之前。这是预期的行为吗?很抱歉浪费时间和空间。