glDrawElements闪烁和崩溃

问题描述:

当我使用glDrawElements()时出现了一个可疑的错误。我试图渲染简单的图元(主要是矩形)来加速绘制文本等等,但是当我调用glDrawElements()时,整个屏幕会在一帧左右闪烁黑色(不仅仅是我的窗口区域)。下一帧会回到与之前相同的“Windows颜色”。因此,这对于闪烁几秒钟,在消息框中说glDrawElements闪烁和崩溃

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

Error 12 

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

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

显然你是混合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

然后它会没事的。

Bah!找到了。当我呈现闪烁+轰然停止以前那样

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

。这是预期的行为?对不起浪费时间和空间。

+0

就其本身而言,'glBindBuffer(GL_ARRAY_BUFFER,0)'不影响调用glDrawElements(你得叫GL *指针捕捉VBO)。 Re'glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0)',这有直接的影响。你的指数在哪里?这个调用告诉GL他们在你自己的_client_内存中,并且DrawElements正在指向那个内存。如果您有一个非零值,那么GL将在当前ELEMENT_ARRAY内将参数视为DrawElements作为_offset_。使用客户端指针作为vbos中的偏移量通常是崩溃的好方法。 – Bahbar