0

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

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

Error 12

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

想想看,它几乎看起来像一些后台缓冲区错误......关于尝试什么的任何想法?

4

2 回答 2

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. 指定正确的索引地址glDrawElements

然后就好了。

于 2009-12-08T23:58:50.170 回答
0

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

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

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

于 2009-12-05T20:35:54.417 回答