在OpenGL ES中无缝分层透明精灵

时间:2013-03-24 02:43:50

标签: android opengl-es sprite opacity alpha

我正在开发基于LibGDX框架的Android应用程序(虽然我认为这不会太多地影响这个问题),而且我无法找到一种方法来获取我想要的结果使用透明的精灵。问题是精灵在它们重叠的位置上明显地叠加在一起,类似于此图像中显示的内容:

Layering problem

对于我想要做的事情来说,这是非常难看的,甚至完全打破了其他部分。我希望他们做的是无缝融合,如下所示:

Layering desired result

到目前为止,我唯一的成功是在完全不透明度的单独纹理上绘制整个精灵序列,然后用所需的不透明度绘制该纹理。我的工作效果很好,我可能会让它适用于我需要的大部分工作,但现在的大问题是这些东西被动态地绘制到屏幕上,以及修改相当大的纹理和发送回来对移动设备非常沉重,并导致无法接受的性能水平。

我花了很多时间寻找更理想的解决方案,包括尝试混合模式,并提出古怪的公式,以平衡alpha和颜色值,以平衡事物,但没有什么特别成功。我的猜测是,唯一可行的途径是前面提到的创建纹理和应用alpha差异的方法,但我不确定使用低功耗移动设备的最佳方法。

1 个答案:

答案 0 :(得分:2)

可能还有其他一些方法可以做到这一点:最直接的方法是连接模板缓冲区并首先将圆圈绘制到模板上,然后用模板绘制一个带有所需颜色+ alpha的全屏矩形,这应该是比一些具有单独纹理的FBO要快得多。

另一件事可能有效,就是首先使用禁用的混合绘制这些圆圈,然后使用倒置的“blendFunc”绘制整个场景,但请注意,如果其他元素也需要混合,则可能无法实现。

3而不是使用模板,你可以使用渲染缓冲区的alpha通道。只需使用颜色蒙版来绘制alpha并绘制圆圈,然后在颜色蒙版上重新启用RGB并使用适当的“blendFunc”绘制全屏rect,此处请注意,如果以前的形状使用了混合,则需要将alpha清除为1.0在执行此操作之前(仅对alpha进行颜色掩码,禁用混合,使用alpha设置为1.0的颜色绘制全屏rect)