2013-03-24 60 views
2

我工作的一个Android应用程序的基础上,LibGDX框架(虽然我不认为应该影响这个问题太多了),而我无法找到一种方式来获得的使用透明精灵进行绘图时的结果。问题是,精灵明显对彼此顶部层,在那里它们重叠,类似于显示此图像中:无缝分层透明的精灵在OpenGL ES

Layering problem

这是一些什么我想要做的相当难看,甚至完全打破其他部分。我想他们做的是无缝融合在一起,就像这样:

Layering desired result

我迄今遇到的唯一的成功是完全不透明画上一个单独的纹理精灵的整个序列,然后用所需的不透明度绘制该纹理。我有这方面的工作适度很好,我也有可能使大多数的什么,我也需要工作,但是大问题,现在的问题是,这些东西都是动态绘制到屏幕上,并修改了相当大纹理的过程中,将它发回给移动设备是非常重要的,并导致不可接受的性能水平。

我花了很长时间寻找更理想的解决方案,包括尝试混合模式,并提出奇特的公式来平衡阿尔法和颜色值,以平衡的方式,但没有什么特别成功。我的猜测是,这是唯一可行的途径是创建纹理和应用阿尔法差到前面提到的方式,但我不能确定的,以与低功率移动设备上工作的最佳方法。任何想法都会非常有帮助。

回答

2

可能还有其他一些方法可以做到这一点:最简单的方法是先附加模板缓冲区,然后先将圆圈画到模板上,然后用模板画出所需颜色+ alpha的全屏矩形,这应该比单独纹理的FBO要快得多。

另一件事可能工作首先绘制这些圈子有残疾混合,然后你的整个场景在它与倒“blendFunc”但注意这可能是不可能的,如果其他元素也需要融合。

第3,而不是使用模板,你可以只用你渲染缓冲的alpha通道。只需使用彩色遮罩仅绘制阿尔法和画的圆圈,然后重新启用RGB色彩掩模,通过适当的“blendFunc”也注意到在这里画全屏矩形,如果前面的形状已经使用混合,你将需要清除阿尔法1.0在此之前(彩色面具只有α,残疾人融合,绘制全屏幕矩形与具有阿尔法设置为1.0的颜色)

+0

我有点经验的OpenGL的,所以它会需要一段时间对我来说,通过这个工作,但你已经是一个很好的帮助,所以谢谢你。我对第一个选项有疑问。从我相当有限的知识来看,我认为走这条路可以防止这些圈子或任何他们所使用的东西利用任何种类的alpha,而不是纯粹透明或不透明的。例如,如果这些圆圈是羽毛状的,那么使用该方法的最终结果仍然会以实心圆圈出现,对吗? – Synthetik 2013-03-26 01:39:47

+0

错误,第一种方法会给你防弹结果。你可以应用任何阿尔法或颜色或任何东西。把它看成是在RGB第5道,你可以用做任何操作与。在大多数情况下,模板缓存用作布尔缓冲区,你清楚它为false,然后绘制原语把一些零部件为true,然后,你想用它。在你的情况下填补所有与特定的颜色,包括阿尔法真正零件渠道。 – 2013-03-26 10:30:22

+0

啊哈!我的印象是,它仅作为固体“黑或白”掩蔽层下。这听起来非常棒,我一定会修补它,同时更好地学习OpenGL,以便将来我知道这些事情。 :p谢谢你指点我正确的方向! – Synthetik 2013-03-26 14:03:28