我意识到OpenGL固定功能管道在这一点上已被彻底弃用,但我使用的引擎是建立在一个旧的代码库之上的,在我升级我的开发机器之前从未表现出任何这类问题这个月,我真的真的而不是重写所有的渲染架构,当它完全符合我的需求时,除了这个bug。
基本上,虽然我开发的游戏中的所有内容在99.999%的时间内正确呈现,但每次都会出现单帧闪烁(可能每20秒左右一帧?)。我录制了视频,以便逐帧比较闪烁的内容,并发现在这些零星的帧上,只有 part 才能呈现我应该是不可分割的精灵。
And a larger example (note the errors on the left side of the screen)
引擎每帧以固定的顺序输出这些绘制调用,但有时它们中的一些似乎被跳过,以便稍后绘制的内容出现,而应始终在之前绘制的内容他们没有。
如果仔细观察,你可以看到所有的文字渲染故障都涉及跳过正好8个字形的块,但是当我查看文本渲染代码时,每个完整的标签都在一对{{1}之间发送。和glBegin(GL_QUADS)
,我的理解应该是不可分割的行为。 OpenGL如何渲染那些的那些顶点而不是其他顶点?
这里是专门针对该标签呈现的实际代码:
glEnd()
然而,2000年的1帧或其他东西似乎会忽略其中32个顶点的组。
我试图找出任何可能导致此问题的原因而受到阻碍,因为它超出了我的深度并且似乎基本上不可能&# 39;,最好的是我对OpenGL操作的有限理解(我想强调的是,这段代码已经存在多年没有变化,只是在我的新PC上运行时才开始出现问题)。我想知道是否有人可能至少指出我可能导致此类问题的方向....
编辑:因为有问题,我正在运行带有GeForce GTX 1060的Windows 10.此错误发生 not 的先前系统是带有Radeon HD 4850的Windows 7,以防万一这可能是相关的。
答案 0 :(得分:0)
在使用AMD Radeon R7在测试机上花了一些时间来调试我的一个应用程序上的类似问题后,这对我有所帮助:
由于兼容性原因,我的应用程序使用旧的 GL 1.0 api组合透明和实体对象(只有少数)(与VBO和其他东西一样,在一张卡或其他卡中总是存在一些问题,所以用户始终可以切换到 GL 1.0 )。
我们通常使用 nVidia 卡来控制 PC ,但这次我们不得不使用 AMD ,并且在安装驱动程序之后会发生奇怪的闪烁。场景的一部分是在每个帧渲染上随机改变颜色。所有使用相同代码(甚至是函数)渲染的对象,以及一些在所有时间都可以正常渲染的对象,以及一些始终闪烁的对象。
删除透明度没有任何效果,所以这不是重点。 AMD对过去呈现的顶点的数量和类型很挑剔,似乎行为返回(在渲染了一些常数数量的面之后)。我还记得英特尔的类似问题,这对于颜色描述非常挑剔。
所以我将两个错误结合起来,找到我的应用程序开始做奇怪事情的地方并放在那里
glColor4f(0.0,0.0,0.0,0.0);
要重置Alpha通道(在透明度中完全没有在代码部分中使用,并在那里正确重置)。它解决了我的问题(至少目前为止)。
如果没有 MCVE ,我只能猜测您的问题是否与此相关,但您可能会尝试在渲染代码中添加一些虚拟glColor4f
调用,以查看行为是否发生了变化。
为了帮助强调你的问题,尝试增加每帧的渲染面数(没有清晰的屏幕或缓冲区交换),因为它往往被渲染到渲染面(处理过的顶点)的数量。