使用glDrawElements()时,我遇到了一个可疑的错误。我正在尝试渲染简单的图元(主要是矩形)以加快文本的绘制等等,但是当我调用glDrawElements()时,整个屏幕闪烁黑色(不仅仅是我的窗口区域)一帧左右。下一帧它变回与以前相同的“Windows颜色”。所以它闪烁了几秒钟,最后在一个消息框中说
The NVIDIA OpenGL Driver encountered an unrecoverable error
and must close this application.
Error 12
在调用glDrawElements()之前,我是否需要重置GL的设置?我知道这不是一些悬空的glEnableClientState(),我检查了它(我曾经有过其中一个,但后来glDrawElements()崩溃了。)
想到它,它几乎看起来像一些后台缓冲区错误...有什么想法尝试?
答案 0 :(得分: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模式绘图:
glVertexPointer
glDrawElements
然后就可以了。
答案 1 :(得分:0)
呸!找到了。当我做的时候
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
在渲染闪烁+崩溃停止之前。这是预期的行为吗?很抱歉浪费时间和空间。