OpenGL:随机调用 OpenGL 函数时崩溃

Posted

技术标签:

【中文标题】OpenGL:随机调用 OpenGL 函数时崩溃【英文标题】:OpenGL: Crashes at random OpenGL function call 【发布时间】:2010-08-12 17:21:25 【问题描述】:

我遇到了奇怪的问题,崩溃是随机发生的,例如我设法使用 3d 应用程序一段时间而没有崩溃,然后大多数时候它总是在我突然同时渲染很多对象时崩溃.

我最近注意到,当使用巨大的纹理尺寸和大量纹理尺寸并在一帧中从一个切换到另一个时,更改此 ATI 卡上的巨大纹理表面会使我的整个计算机崩溃。因此,我有可能损坏了 ATI 卡或只是有问题的卡。但这是不可能的,因为我最近添加了一些代码,现在我第一次注意到这个崩溃。我没有使用任何特殊的 opengl 调用,只是使用旧的 glbegin() glend() glcolor() 等...

如果我注释掉之前崩溃的行,例如 glBegin(GL_QUADS) ... glEnd() 那么下次我在代码的不同位置调用不同的 openGL 函数时崩溃,例如 glColor4f() 和然后我将其注释掉,下一次崩溃是在渲染代码的完全不同部分的 glClear() 处!

什么可能导致这些?我正在使用 ATI 卡,并且我知道如果使用不正确的值,某些 opengl 调用可能会使程序崩溃,例如 glLineWidth(4) 会在 openGL 代码的随机行上使某些 ATI 卡崩溃,因为最大线宽为 3!

编辑:

当我使用 ApplicationVerifier 在调试模式下运行程序时,它会抛出这一行:

if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))

我不明白,这可能是什么问题?

pfd:

static PIXELFORMATDESCRIPTOR pfd = 
   // *correct amount of elements*
;

【问题讨论】:

最好的办法是在另一台 GPU 的计算机上尝试你的程序,看看它是否也会崩溃 【参考方案1】:

IMO,OpenGL 中的崩溃很可能只是一个症状,而真正的问题在于其他地方。一般来说,您的描述听起来或多或少是资源滥用的典型(例如,内存泄漏、使用悬空指针、破坏堆等)

像驱动程序错误这样的事情肯定可能 -- 事实上,图形驱动程序足够大和复杂,一些错误可能几乎是不可避免的。显而易见的测试是运行使用 OpenGL 的 other 代码并查看它是否可靠地工作。您总是有可能使用包含错误的执行路径,但几乎没有其他人使用它,因此不会触发错误 - 但鉴于崩溃没有发生在固定位置,那似乎不太可能(仍然可能,只是不太可能)。如果图形驱动程序存在错误(尤其是严重到足以导致崩溃的错误,而不仅仅是错误渲染),通常很快就会被人们发现。

【讨论】:

看来你是对的......我从调试文件夹中的大纹理中滑过>_>不再崩溃!但仍然对应用程序验证工具错误行没有帮助,我不知道那是什么:7【参考方案2】:

这种随机行为通常是堆栈/堆损坏的症状。你应该检查你没有破坏堆和/或堆栈。错误的驱动程序也是一种选择,因为在无效值上崩溃是一个错误,它不应该崩溃而是产生一个 GL 错误。

【讨论】:

不支持windows >_>

以上是关于OpenGL:随机调用 OpenGL 函数时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 在渲染帧之前崩溃 - VBO

调用glGenBuffers时openGL崩溃

OpenGL glBindTexture() 崩溃

使用 OpenGL 正确关闭 SDL

为啥在使用 OpenGL 核心配置文件时会崩溃?

OpenGL glBufferStorage 崩溃