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

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

Error 12

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

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

有帮助吗?

解决方案

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

你打电话时:

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

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

如果你 解除当前 VBO 和 IBO 的绑定(使用上面两个 glBindBuffer 调用),这意味着当使用相同的 glDrawElements 渲染时,x 将用作索引数据的偏移量 在国际生物组织中, ,最后一次调用 glVertexPointer 作为顶点数据的偏移量 在VBO中.

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

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

  1. 解绑当前VBO
  2. 解除当前IBO的绑定
  3. 指定正确的顶点地址 glVertexPointer
  4. 指定正确的索引地址 glDrawElements

然后就没事了。

其他提示

呸!找到了。当我做

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

渲染闪烁+轰然停止之前。这是预期的行为?遗憾的浪费时间和空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top