LibGDX帧缓冲混合

3
一些背景知识,我刚开始使用LibGDX框架尝试开发Android游戏。我正在尝试使用他们的FrameBuffer类通过放置精灵来构建纹理,并且我想将这个纹理作为一种逐层动态/随机背景。不幸的是,当精灵添加到FrameBuffer时,它们会完全覆盖它们下面的任何东西。通常情况下这没问题,但我将使用许多具有半透明像素的精灵,因为这些透明像素将覆盖任何在其下方的实心像素,从而显示出基础背景颜色并产生非常不愉快的效果。
换句话说,创建由多个精灵组成的一个坚固的纹理,并将它们层叠在彼此之上,而不完全删除较低的像素(至少如果顶部像素是半透明的),最好的方法是什么?
经过几个小时的实验和搜索,我束手无策。感谢您的时间!
-----编辑-----
以下是用于将精灵添加到FBO的代码。它非常简单,因为现在我只是为了测试目的在随机位置添加一个精灵。如果需要,我很乐意发布任何代码,但整个设置现在非常简约,以解决此问题。
    m_fbo.begin();
    batch.begin();
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    sprite.draw(batch);
    batch.end();
    m_fbo.end();

你能展示一下你正在使用的代码,将精灵添加到帧缓冲区吗? - Tim
我添加了代码,但它并不过分。我只是在随机位置上撒了一个单一的精灵进行测试。我还尝试了很多混合模式的组合,但似乎并不那么容易解决。 - Chime
你正在绘制的纹理是否应该有任何透明像素?我认为问题可能是你正在将低 alpha 像素绘制到帧缓冲区中,以便它们将被混合,但如果你保持混合状态,则最终的纹理也将与你放置在其上的任何表面混合。当最终绘制 FBO 纹理时,你是否禁用了混合? - Tim
我需要启用混合,因为添加到此背景纹理的精灵确实需要具有透明像素。我还没有任何永久设置,但可以考虑像云一样的东西,如果我删除其边缘上的所有透明像素,它看起来会很突兀。 - Chime
1个回答

0

虽然这是一个老问题,但您能否粘贴FBO初始化代码?您需要在FBO中拥有一个alpha通道。另外,FBO是GLES 2.0的特性,因此您可能需要使用自己的着色器,因为在GLES 2.0上必须手动进行alpha测试。

最后,您是否在批处理中启用了混合?

batch.enableBlending();

应该可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接