我正在为Android和iOS开发一款跨平台游戏。对于几个类似广告牌的对象,我使用添加剂混合(glBlend(GL_ONE, GL_ONE)
)和黑色背景纹理。渲染的对象看起来很好(即纹理中的黑色像素看起来完全透明)几乎无处不在。但是在Adreno GPU的两个不同Android设备上(一个是Nexus 4,另一个是Sony Xperia Go)我有这样的人工制品:
使用汉堡包图标可以看到,背景颜色会渗透到渲染的四边形中。我假设它是背景颜色流血,因为当广告牌四边形直接在背景前时效果不可见。为了使事物变得更奇怪,当我从设备截取屏幕截图时,效果是不可见的,所以我必须用另一个相机拍摄屏幕的照片。我还注意到,当我从Android开发人员设置中启用Disable HW Overlays
时,人工制品就会消失。当我在屏幕上有另一个透明窗口时,人工制品也会消失,例如当我按下音量按钮时的音量滑块。
当我渲染场景时,我首先在第一遍中渲染不透明物体,然后在第二遍中使用glBlend(GL_ONE, GL_ONE)
渲染透明广告牌并禁用深度写入。
答案 0 :(得分:0)
仅仅为了记录,我花了很长时间才找到罪魁祸首,但最后我发现了原因。事实证明,并非所有我所谓的“不透明”物体都是不透明的(即它们具有α值<1.0)。
因此,在使用硬件覆盖的设备上,在具有单个硬件覆盖的设备上,人工制品变得可见,它看起来很好。我不是100%肯定,但是当我有一个覆盖窗口(例如我的应用程序窗口顶部的系统音量栏)批准这与覆盖有关时会产生影响。
在我确定所有不透明物体都是不透明的问题后,问题就消失了。