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模式拉丝后:
- 取消绑定当前VBO
- 取消绑定当前IBO
- 指定正确的顶点与
glVertexPointer
解决
- 指定合适的指数与解决
glDrawElements
然后它会没事的。
答
Bah!找到了。当我呈现闪烁+轰然停止以前那样
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 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