为什么OpenGL固定功能管道似乎偶尔只会部分渲染单个绘制调用?

时间:2017-09-27 17:39:54

标签: java opengl lwjgl

我意识到OpenGL固定功能管道在这一点上已被彻底弃用,但我使用的引擎是建立在一个旧的代码库之上的,在我升级我的开发机器之前从未表现出任何这类问题这个月,我真的真的而不是重写所有的渲染架构,当它完全符合我的需求时,除了这个bug。

基本上,虽然我开发的游戏中的所有内容在99.999%的时间内正确呈现,但每次都会出现单帧闪烁(可能每20秒左右一帧?)。我录制了视频,以便逐帧比较闪烁的内容,并发现在这些零星的帧上,只有 part 才能呈现我应该是不可分割的精灵。

我的意思的一个例子 An example of what I mean
(左侧正确输出,右侧有毛刺的框架)

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,以防万一这可能是相关的。

1 个答案:

答案 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调用,以查看行为是否发生了变化。

为了帮助强调你的问题,尝试增加每帧的渲染面数(没有清晰的屏幕或缓冲区交换),因为它往往被渲染到渲染面(处理过的顶点)的数量。