我有一个OpenGL测试应用程序,产生令人难以置信的不寻常的结果。当我启动应用程序时,它可能会或可能不会出现严重的图形错误。什么导致这个不可预知的OpenGL错误?
它可能会产生这样的图像: http://i.imgur.com/JwPoDrh.jpg
或者这样: http://i.imgur.com/QEYwhBY.jpg
或者只是正确的图像,像这样: http://i.imgur.com/zUJbwCM.jpg
的场景由一个旋转的彩色立方体(由12个三角形组成),上面有一个简单的着色器,它根据模型空间坐标的绝对值为像素着色。垃圾面似乎与立方体一起旋转,好像它们被附着在立方体上一样,并且通常垃圾三角形或四边形短暂地在屏幕上闪烁,就好像它们是以2D渲染的一样。
我发现最不寻常的事情是,行为是高度不一致的,重复启动完全相同的应用程序,而不是我个人改变系统上的其他任何东西会产生不同的结果,有时会出错,有时候不会,产生的垃圾面也不一致。
我无法真正发布应用程序的源代码,因为它非常冗长,实际的OpenGL调用分布在很多包装类和类似的地方。
这是在以下条件下发生:
视窗10 64位操作系统(虽然我已经视窗8.1 64位下观察非常相似的行为)。
AMD FX-9590 CPU(华硕Sabertooth 990FX主频为4.7GHz)。
AMD 7970HD GPU(已有两三年的历史,偶尔3D应用程序中的屏幕区域会变得混乱,但在我所经历的范围内没有任何变化)。
使用SDL(https://www.libsdl.org/)进行窗口和上下文创建。
对OpenGL使用GLEW(http://glew.sourceforge.net/)。
使用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。
我不认为这是一个很好的问题,因为如果它不可能提取到少量的代码。想到的一种可能性是您可能错过了清除深度缓冲区。 –
你超频你的显卡吗?它已经在其他软件中出现问题,所以它可能是罪魁祸首。 CPU也可能过快地向卡发送数据,导致一些数据被破坏。尝试降低CPU的时钟速度。 – 1201ProgramAlarm
我会尝试创建在单个函数中产生错误的代码。不过,我觉得,鉴于这个bug已经在3个独立的实现中显示出来,并且如此不可预测,所以它是一些潜在的问题,而不是代码中的错误。 (另外我在glClear期间清除深度缓冲区)。 – user573949