我们是一个开发者团队,致力于开发虚拟 3D 地球上的地形可视化软件。该项目针对运行android的移动设备,主要是平板电脑和手机。我们已经在多个设备上对此进行了测试,虽然手机似乎可以很好地运行应用程序(我们没有检测到任何问题),但一些平板电脑在屏幕上绘制纹理时似乎有问题。
为了清楚起见,我附上了一个显示问题的视频,因为它有点难以用语言来解释。此示例显示一个球体被分成 200 个扇区,每个扇区具有不同的纹理。
如您所见,有时看起来它试图同时在同一扇区中绘制两个不同的纹理。
我们已经在这些设备上进行了测试:
- 三星 Galaxy S SLC(正常)
- HTC 欲望(确定)
- Nook 电子书阅读器(确定)
- Samsung Galaxy Tab 10.1(无法正常工作)
- Sony Tablet S(也不能用)
- 三星 Galaxy Tab 7.0(正常)
我发布了可能涉及的关键代码。首先是用于绘制纹理的 fragment 着色器:
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);
很抱歉无法提供更多详细信息,但经过数周的调试,我们完全不知道是什么原因造成的。我转向你希望有任何线索,因为我们现在完全迷路了。提前致谢。
最佳答案
我想我可能知道是什么给你带来了困难。唯一不适合您的设备是 Tegra 2 设备。我最近开始使用 Tegra 2 设备并注意到某些差异。与其他设备相比,Nvidia 似乎引入了某些类型的舍入错误,其中某些行为可能与其他 GPU 不同。我不得不竭尽全力并使用变通办法让它以我想要的方式使用我的复杂着色器。
我在您的视频中看到的内容看起来有点像 z 缓冲区可能没有足够的分辨率,这会导致某种 z 冲突:http://en.wikipedia.org/wiki/Z-fighting .我不确定,因为我并没有真正从您的代码/描述中看到您绘制的三角形非常靠近并可能在 z 缓冲区中导致这种行为。
但也许您可以尝试向上或向下缩放顶点 (x,y,z),看看闪烁会发生什么。如果它发生变化,它可能与此有关,如果没有,则问题可能有其他原因,但是再多一点代码会很好。
通过不绘制整个球体而只绘制出现问题的一两个三角形并查看它是否仍然发生来尝试缩小问题范围也很有趣。
PS:如果视频再长点就好了,短片太烂了。
关于android - Opengl 纹理在某些 Android 设备中闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227926/