2

我正在为 Android 和 iOS 开发跨平台游戏。对于几个类似广告牌的对象,我使用glBlend(GL_ONE, GL_ONE)带有黑色背景纹理的加法混合()。渲染的对象几乎在任何地方看起来都很好(即纹理中的黑色像素看起来完全透明)。然而,在两个不同的 Android 设备上使用 Adreno GPU(一个 Nexus 4 和另一个 Sony Xperia Go)我有这样的人工制品:在此处输入图像描述

正如汉堡包图标可见,背景颜色渗入渲染的四边形。我假设它是背景颜色渗色,因为当广告牌四边形直接位于背景前面时效果不可见。为了让事情变得更奇怪,当我从设备截屏时效果不可见,所以我必须用另一个相机拍摄屏幕照片。我还注意到,当我Disable HW Overlays从 Android 开发人员设置中启用时,这些伪影消失了。当我在屏幕上有另一个透明窗口时,人工制品也会消失,例如按下音量按钮时的音量滑块。

当我渲染我的场景时,我首先在第一遍渲染不透明对象,然后在第二遍渲染透明广告牌,glBlend(GL_ONE, GL_ONE)并禁用深度写入。

4

1 回答 1

0

只是为了记录,我花了很长时间才找到罪魁祸首,但最终我找到了原因。事实证明,并非我所有的“假定”不透明对象都是真正不透明的(即它们的 alpha 值 < 1.0)。

因此,在使用硬件覆盖的设备上,伪影变得可见,而在具有单个硬件覆盖的设备上看起来很好。我不是 100% 确定,但是当我的应用程序窗口顶部有一个覆盖窗口(例如系统音量栏)时,这与覆盖有关。

在我确定我所有的不透明物体都是真的不透明之后,问题就消失了。

于 2013-05-31T17:55:48.957 回答