我正在使用VBO扩展来存储Vertex,普通和颜色缓冲区(glBindBufferARB) 出于某种原因,在更改缓冲区或执行某些操作时,应用程序会因访问冲突而崩溃。当附加调试器时,我发现崩溃是在某个线程中,这个线程不是我的主线程,它执行opengl调用,并执行某些与nvidia图形驱动程序相关的dll。
可能发生的是我给缓冲区调用了一个错误的缓冲区或者错误的大小。所以我的问题是,我该如何调试这种情况?崩溃似乎发生在实际调用之后的一段时间以及不同的线程中。
答案 0 :(得分:3)
假设这是关于Windows的,NVIDIA有一个GLExpert工具。它可以打印各种OpenGL警告/错误。
在其他一些情况下,使用GLIntercept OpenGL调用拦截器并启用错误检查可能很有用。
如果工具没有帮助,那么它的旧调试很好。尝试缩小问题范围,找出导致崩溃的原因。如果这是NVIDIA特定的问题,请尝试安装不同的驱动程序和/或询问NVIDIA开发人员论坛。
答案 1 :(得分:0)
我认为你可能只需要蛮力那一个。 即用一行几行注释掉任何vbo直到你的程序不再崩溃。然后你就会知道要关注哪些线条,并仔细检查你传递的参数。
同时尝试在程序周围自由地调用glError()调用。通常,如果你传递一个伪造的参数,glError会在它崩溃之前告诉你一些错误。
答案 2 :(得分:-1)
最好的OpenGl / D3D调试工具之一是nVidia的NvPerfHUD。它无法帮助您找到确切的问题,但它确实提供了另一种关于您要发送到渲染管道的视图。
但是,我会说我只在D3D应用程序中使用它,所以我不知道它对OpenGL程序有多大帮助。
编辑:
我不确定为什么这会被否决。我以前用NvPerfHUD调试过VB和IB问题。简单的事情,例如糟糕的原始数量,并通过查看每个绘制调用来诊断。