glDrawElements闪烁和崩溃

Jon*_*röm 0 opengl nvidia visual-c++

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

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

Error 12
Run Code Online (Sandbox Code Playgroud)

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

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

Str*_*ger 5

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

你打电话的时候:

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

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

如果你取消绑定当前VBO和IBO(与上述两个glBindBuffer调用),这意味着具有相同glDrawElements渲染时,x是用作对指标数据偏移的IBO,最后调用glVertexPointer作为VBO中顶点数据的偏移量.

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

因此,为了回答您的问题,在使用VBO模式绘制然后使用VA模式绘制之后:

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

然后就没事了.