Opengl纹理在一些Android设备中闪烁

时间:2012-02-10 12:39:39

标签: android mobile opengl-es 3d tablet

我们是一个开发人员团队,致力于通过虚拟3D地球仪构建地形可视化软件。该项目旨在运行Android的移动设备,主要是平板电脑和手机。我们已经在几个设备中对此进行了测试,虽然移动电话似乎运行应用程序很好(我们没有检测到任何问题),但是一些平板电脑在屏幕上绘制纹理时似乎有问题。

为了清楚起见,我附上一个显示问题的视频,因为它有点难以用文字解释。此示例显示了一个划分为200个扇区的球体,每个扇区具有不同的纹理。

Texture problem video

正如您所看到的,有时看起来它似乎试图同时在同一扇区中绘制两个不同的纹理。

我们已在这些设备中对此进行了测试:

  • 三星Galaxy S SLC(确定)
  • HTC Desire(ok)
  • Nook电子书阅读器(确定)
  • 三星Galaxy Tab 10.1(不合适)
  • Sony Tablet 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);

对不起,我不能提供更多详细信息,但经过几周的调试后,我们完全没有任何可能导致此问题的线索。我转向你希望有任何线索,因为我们现在完全迷失了。提前谢谢。

1 个答案:

答案 0 :(得分:2)

我想我可能知道是什么原因造成你的困难。唯一不适合您的设备是Tegra 2设备。我最近开始使用Tegra 2设备并发现了一些差异。与其他设备相比,Nvidia似乎已经引入了某些类型的舍入错误,其中某些事情可能与其他GPU的行为不同。我不得不采用极端的长度并使用变通方法让它以我想要的方式使用我的复杂着色器。

我在你的视频中看到的东西看起来有点像z-buffer可能没有足够的分辨率并导致某种z-fighting:http://en.wikipedia.org/wiki/Z-fighting。我不确定,因为我没有从你的代码/描述中看到你是否正在绘制非常接近的三角形并且可能在z缓冲区中引起这种行为。

但也许您可以尝试稍微向上或向下缩放顶点(x,y,z),看看闪烁会发生什么。如果它改变了它可能与它有关,如果没有,问题可能有另一个原因,但那么更多的代码会很好。

尝试通过不绘制整个球体来缩小范围,但只是出现问题的一个或两个三角形并查看它是否仍然存在,这也很有趣。

PS:较长的视频会更好,短片会吸收vimeo。