【问题标题】:Opengl texture flickering in some android devicesOpengl 纹理在某些 android 设备中闪烁
【发布时间】:2012-02-10 12:39:39
【问题描述】:

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

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

Texture problem video

如您所见,有时它看起来像是试图同时在同一个扇区中绘制两个不同的纹理。

我们已经在这些设备上进行了测试:

  • 三星 Galaxy S SLC (ok)
  • HTC Desire (ok)
  • Nook 电子书阅读器(好的)
  • Samsung 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);

很抱歉无法提供更多细节,但经过几周的调试,我们完全不知道是什么原因造成的。我转向你希望有任何线索,因为我们现在完全迷路了。提前致谢。

【问题讨论】:

  • 在每个渲染周期后添加 glFlushglFinish 可能会有所帮助,因为您似乎在不断地进行相当广泛的渲染状态更改。
  • 感谢您的建议,但不幸的是它不起作用。

标签: android mobile opengl-es 3d tablet


【解决方案1】:

我想我可能知道是什么导致了你的困难。唯一不适合您的设备是 Tegra 2 设备。我最近开始使用 Tegra 2 设备并注意到某些差异。与其他设备相比,Nvidia 似乎引入了某些类型的舍入误差,其中某些东西的行为可能与其他 GPU 不同。我不得不竭尽全力并使用变通方法让它以我想要的方式与我的复杂着色器一起工作。

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

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

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

PS:更长的视频会更好,短片很糟糕。

【讨论】:

  • 感谢您的回复,我还无法检查任何内容,但您提供的一些信息看起来很有希望!我会尽快给你一些反馈。另外,我会尝试发布一些更详细的代码(正如我所说的,因为代码很大)和更长的视频。
  • 好的,我已经做了一些测试。在这种情况下,z-buffer 没有问题。我们移除了球体的背面,仅显示 0 到 80 的扇区。这意味着大多数彩色像素只有一个三角形投影在其上,因此没有 z-buffer 冲突。每个扇区由 16x16 个顶点(256 个三角形)组成,它们之间没有重叠。是的,肯定是Tegra2相关的问题,但我们还是不知道是什么问题。
  • 可能值得调查的事情:闪烁是仅在某些三角形/正方形上还是在所有三角形/正方形上都发生?如果您更改纹理(仅使用 1 个纹理)会发生这种情况吗?您可以将 opengl 更改为 1.1 以进行测试还是必须为 2.0 ?您使用多少纹理内存?有很多事情你没有发布关于你实际在做什么所以不幸的是我能说的只是纯粹的猜测。我真的建议你只显示一个三角形,看看会发生什么,然后慢慢增加这个数字。
  • 好的,经过几次测试后,似乎是使用 glDrawArrays 导致了这个问题。我们已经为 glDrawElements 更改了它,现在一切正常。可能是 tegra2 的 glDrawArrays 中的错误?无论如何,非常感谢您的帮助。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多