我们是一支开发团队,致力于在虚拟3D地球上进行地形可视化软件开发。该项目旨在为运行Android系统的移动设备提供服务,主要针对平板电脑和手机。我们已经在多个设备上进行了测试,虽然手机似乎可以正常运行应用程序(我们没有在任何一个设备上检测到任何问题),但一些平板电脑在屏幕绘制纹理时似乎存在问题。
为了清晰起见,我附上了一个视频来显示这个问题,因为用文字描述有点困难。这个例子展示了一个球体被分成了200个扇形,每个扇形上都有不同的纹理。 纹理问题视频 如您所见,有时它看起来像是试图同时在同一个扇区中绘制两种不同的纹理。
我们已在以下设备上进行了测试:
- 三星Galaxy SSLC(正常) - HTC Desire(正常) - Nook电子书阅读器(正常) - 三星Galaxy Tab 10.1(不能正常工作) - 索尼平板S(也不能正常工作) - 三星Galaxy Tab 7.0(正常)
我发布了可能涉及其中的关键代码。首先是用于绘制纹理的片段着色器:
为了清晰起见,我附上了一个视频来显示这个问题,因为用文字描述有点困难。这个例子展示了一个球体被分成了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);
很抱歉无法提供更多细节,经过几周的调试后,我们完全不知道是什么原因导致这种情况发生。现在我向您求助,希望能寻找到任何线索,因为我们现在已经彻底迷失了方向。谢谢。
glFlush
或glFinish
可能会有所帮助,因为您似乎不断进行着相当广泛的渲染状态更改。 - harism