C++ 什么';是什么导致了这个不可预知的OpenGL错误?

C++ 什么';是什么导致了这个不可预知的OpenGL错误?,c++,opengl,gpu,C++,Opengl,Gpu,我有一个OpenGL测试应用程序,它产生了难以置信的异常结果。当我启动应用程序时,它可能有也可能没有严重的图形错误 它可能会产生如下图像: 或者像这样: 或者只是正确的图像,如下所示: 场景由一个旋转的彩色立方体(由12个三角形组成)组成,立方体上有一个简单的着色器,该着色器根据像素的模型空间坐标的绝对值为像素着色。垃圾面似乎与立方体一起旋转,就好像它们附着在立方体上一样,并且垃圾三角形或四边形通常会在屏幕上短暂闪烁,就好像它们是在二维中渲染的一样 我发现最不寻常的一点是,这种行为是高度不

我有一个OpenGL测试应用程序,它产生了难以置信的异常结果。当我启动应用程序时,它可能有也可能没有严重的图形错误

它可能会产生如下图像:

或者像这样:

或者只是正确的图像,如下所示:

场景由一个旋转的彩色立方体(由12个三角形组成)组成,立方体上有一个简单的着色器,该着色器根据像素的模型空间坐标的绝对值为像素着色。垃圾面似乎与立方体一起旋转,就好像它们附着在立方体上一样,并且垃圾三角形或四边形通常会在屏幕上短暂闪烁,就好像它们是在二维中渲染的一样

我发现最不寻常的一点是,这种行为是高度不一致的,重复启动完全相同的应用程序而不亲自更改系统上的任何其他内容将产生不同的结果,有时出现错误,有时没有,生成的垃圾脸的排列也不一致

我真的不能发布应用程序的源代码,因为它非常长,而且实际的OpenGL调用分布在许多包装器类中

这是在以下情况下发生的:

  • Windows 10 64位操作系统(尽管我在Windows 8.1 64位操作系统下观察到非常类似的行为)

  • AMD FX-9590 CPU(华硕Sabertooth 990FX的时钟频率为4.7GHz)

  • AMD7970HDGPU(它已经有几年的历史了,3D应用程序中的屏幕区域偶尔会出现混乱,但没有我在这里体验到的那样大)

  • 使用SDL()创建窗口和上下文

  • 在OpenGL中使用GLEW()

  • 使用OpenGL版本1.0、3.3和4.3(我假设SDL确实使用了我指示它使用的版本)

  • AMD Catalyst驱动程序版本15.7.1(驱动程序包装版本列为15.20.1062.1004-150803a1-187674C,尽管我在更老的驱动程序上也看到了非常类似的行为)

  • Catalyst Control Center将我的OpenGL版本列为6.14.10.13399


在我看来,这就像是一张损坏的图形卡。很可能是内存有问题(内存本身或某些焊接问题)。如果出于某种原因,在开始读取之前,设置内存操作的地址没有完全解决或根本没有发生,则可能会出现类似您看到的工件;这可能是由于GPU和内存之间的连接不良(焊接连接失败)或内存本身出现故障造成的


解决方案:购买新的图形卡。您可以尝试一下,如果您使用回流焊工艺对其进行再熔,会发生什么情况;有一些关于如何进行DIY的教程,但是一个合适的回流炉可以提供更好的结果。

我认为这不是一个很好的问题,如果不可能将其提取为少量代码。我想到的一种可能性是,您可能没有清除深度缓冲区。您是否超频了视频卡?它已经在其他软件中出现故障,因此很可能是罪魁祸首。也可能是CPU向卡发送数据的速度过快,导致部分数据损坏。尝试降低CPU的时钟速度。我将尝试创建在单个函数中产生错误的代码。然而,我觉得,考虑到这个bug已经在3个不同的实现中出现,并且是如此不可预测,这是一些潜在的问题,而不是代码中的错误。(同时我正在glClear期间清除深度缓冲区)。我将降低时钟速度,看看是否有任何变化。我的视频卡完全以库存设置运行,因为当我超频时,它会变得非常不稳定,并且通常会使运行在它上面的任何3D应用程序崩溃。我建议在另一台计算机上运行它。可能的原因可能是:坏内存、驱动程序错误。你会使用纹理阵列或3D纹理吗?我遇到了ATI的驱动程序问题,这些问题会产生类似的错误。但我同意其他评论:这只是没有代码的猜测。我打赌RAM不好,因为有这样一句话:“3D应用程序中的屏幕区域偶尔会被打乱”。我相信你是对的,我把可执行文件发送给了另外两个人,它在他们的机器上运行得非常完美。看起来像一个新的GPU,然后。。。