在某些安卓设备上,Opengl纹理会出现闪烁问题

3
我们是一支开发团队,致力于在虚拟3D地球上进行地形可视化软件开发。该项目旨在为运行Android系统的移动设备提供服务,主要针对平板电脑和手机。我们已经在多个设备上进行了测试,虽然手机似乎可以正常运行应用程序(我们没有在任何一个设备上检测到任何问题),但一些平板电脑在屏幕绘制纹理时似乎存在问题。
为了清晰起见,我附上了一个视频来显示这个问题,因为用文字描述有点困难。这个例子展示了一个球体被分成了200个扇形,每个扇形上都有不同的纹理。 纹理问题视频 如您所见,有时它看起来像是试图同时在同一个扇区中绘制两种不同的纹理。
我们已在以下设备上进行了测试:
- 三星Galaxy SSLC(正常) - HTC Desire(正常) - Nook电子书阅读器(正常) - 三星Galaxy Tab 10.1(不能正常工作) - 索尼平板S(也不能正常工作) - 三星Galaxy Tab 7.0(正常)
我发布了可能涉及其中的关键代码。首先是用于绘制纹理的片段着色器:
varying mediump vec2 TextureCoordOut;
uniform sampler2D Sampler;
....
gl_FragColor = texture2D (Sampler, TextureCoordOut);

接下来,我将发布在OpenGL中执行的关键指令,因为代码被保存在几个大型函数中:

GLES20.glGenTextures(num, idTextures, 1);  //declare 200 textures
...
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, idTextures[texture]); //texture binding
...
GLES20.glVertexAttribPointer(Attributes.Position, size, GLES20.GL_FLOAT, false, stride, fb);
...
GLES20.glVertexAttribPointer(Attributes.TextureCoord, size, GLES20.GL_FLOAT, false, stride, fb);
...
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, first, count);

很抱歉无法提供更多细节,经过几周的调试后,我们完全不知道是什么原因导致这种情况发生。现在我向您求助,希望能寻找到任何线索,因为我们现在已经彻底迷失了方向。谢谢。


在每个渲染周期之后添加glFlushglFinish可能会有所帮助,因为您似乎不断进行着相当广泛的渲染状态更改。 - harism
谢谢您的建议,但不幸的是它没有起作用。 - Kilian Perdomo Curbelo
1个回答

2
我想我知道是什么导致了你的困难。唯一不能正常工作的设备是Tegra 2设备。最近,我开始使用Tegra 2设备并注意到某些差异。与其他设备相比,Nvidia似乎引入了某些舍入误差,其中一些事物可能会与其他GPU表现不同。我不得不采取极端措施并使用解决方法来使我的复杂着色器按照我想要的方式运行。
而从你的视频中可以看出,似乎z缓冲区可能没有足够的分辨率,这会导致某种z-fighting:http://en.wikipedia.org/wiki/Z-fighting。我不确定,因为我没有从你的代码/描述中看到你是否正在绘制非常接近的三角形,这可能会在z缓冲区中引起这种行为。
但也许你可以尝试将顶点(x,y,z)稍微放大或缩小,看看闪烁情况会发生什么变化。如果它改变了,那么它可能与此有关,如果没有,那么问题可能有其他原因,但是更多的代码将是很好的。
还尝试通过不绘制整个球体,而只绘制出现问题的一个或两个三角形来缩小范围,看看问题是否仍然存在。
附注:更长的视频会更好,vimeo上的短片很糟糕。

谢谢你的回复,我还没有看过任何东西,但是你提供的一些信息看起来很有前途! 我会尽快给你一些反馈。另外,我会尝试发布一些更详细的代码(正如我所说,这很难,因为代码非常大)和更长的视频。 - Kilian Perdomo Curbelo
好的,我已经进行了一些测试。在这种情况下,z缓冲区没有问题。我们已经移除了球体的背面,只显示从0到80的扇形。这意味着大多数有颜色的像素上只投射了一个三角形,因此不存在z缓冲区冲突。每个扇形由16x16个顶点(256个三角形)组成,它们之间没有重叠。是的,这一定是与Tegra2相关的问题,但我们仍然不知道具体是什么问题。 - Kilian Perdomo Curbelo
值得调查的事情:闪烁只发生在某些三角形/正方形上,还是所有三角形/正方形都有此问题?更改纹理(仅使用1个纹理)是否会出现此问题?您可以将OpenGL更改为1.1进行测试,还是必须使用2.0?您使用了多少纹理内存?关于您实际正在做的事情,有很多事情您没有发布,所以我所能说的都只是纯推测。我真的建议您只显示一个三角形,然后看看会发生什么,然后慢慢增加数量。 - HardCoder
1
经过几次测试,似乎使用glDrawArrays引起了这个问题。我们已经改为使用glDrawElements,现在一切都正常了。也许是tegra2中glDrawArrays的一个bug?无论如何,非常感谢您的帮助。 - Kilian Perdomo Curbelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接