LibGDX FrameBuffer 混合

Posted

技术标签:

【中文标题】LibGDX FrameBuffer 混合【英文标题】:LibGDX FrameBuffer blending 【发布时间】:2012-08-14 23:24:17 【问题描述】:

这里有一些简单的背景知识,我刚开始使用 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();

【问题讨论】:

你能展示你用来向帧缓冲区添加精灵的代码吗? 我添加了代码,但至少并不过分。我只是在随机位置散布一个精灵进行测试。我也尝试了很多混合模式的组合,但似乎并不那么容易解决。 你正在绘制的纹理,它是否应该有任何透明像素?我认为问题可能是您正在将具有低 alpha 的像素绘制到帧缓冲区上,以便将它们混合,但是如果您保持混合,那么生成的纹理将与任何表面混合你把它放在上面。最终绘制 FBO 纹理时是否禁用混合? 我需要启用混合,因为添加到此背景纹理的精灵确实需要具有透明像素。我还没有永久设置任何东西,但是想想像云这样的东西,如果我移除沿其边缘的所有透明像素,它看起来会被拍打。 【参考方案1】:

老问题,你能粘贴FBO初始化代码吗?您需要在 FBO 中有一个 Alpha 通道。另一件事是 FBO 是 GLES 2.0 的特性,因此您可能希望使用自己的着色器,因为 alpha 测试必须在 GLES 2.0 上手动完成。

最后,您是否在批次上启用了混合?

batch.enableBlending();

应该可以解决问题。

【讨论】:

以上是关于LibGDX FrameBuffer 混合的主要内容,如果未能解决你的问题,请参考以下文章

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

LibGDX - 绘制到 FrameBuffer 不起作用

如何在 libgdx 中正确设置 FrameBuffer 的宽度和高度?

libgdx 中的 FrameBuffer 大小

Libgdx - FrameBuffer 渲染和 FitViewport

iOS 上的 LibGDX FrameBuffer 怪癖