【问题标题】:Libgdx framebuffer blending not workingLibgdx 帧缓冲区混合不起作用
【发布时间】:2013-12-20 04:03:44
【问题描述】:

我正在尝试在我的游戏中制作动态 2D 阴影。

我成功地将阴影渲染到帧缓冲区。 (灰色和白色方块表示透明度)

然后出于调试目的,我将帧缓冲区的内容渲染到另一个帧缓冲区之上,该帧缓冲区每帧都被清除为白色,然后在我的游戏中渲染此帧。这很好用……只要我以 100% 的不透明度渲染阴影:

但如果我在第二个帧缓冲区上绘制阴影之前这样做,

spriteBatch.setColor(0f, 0f, 0f, 0.5f);

透明阴影穿过帧缓冲区,您可以看到下面的游戏世界。

这是我的代码:

public class Light
{
    FrameBuffer shadowbuffer; // for rendering shadows
    FrameBuffer buffer; // for debug
    OrthographicCamera cam;

    public Light(Images images)
    {
        shadowbuffer = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);

        buffer = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);     

        cam = new OrthographicCamera(buffer.getWidth(), buffer.getHeight());
        cam.setToOrtho(true);
        cam.update();
    }

    public Texture render(SpriteBatch batch, GameWorld world)
    {
        batch.end();
        batch.setProjectionMatrix(cam.combined);

        shadowbuffer.begin();
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);  
        batch.begin();

        // ... render shadows here ...

        batch.end();
        shadowbuffer.end();

        buffer.begin();
        Gdx.gl.glClearColor(0, 0, 0, 0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        batch.begin();

        batch.setColor(0f, 0f, 0f, .5f);
        batch.draw(shadowbuffer.getColorBufferTexture(), 0, 0);
        batch.setColor(Color.WHITE);

        batch.end();
        buffer.end();

        batch.begin();

        return buffer.getColorBufferTexture();
    }
}

我尝试了各种不同的混合设置,但都不起作用..

编辑以下是我目前使用的混合设置:

    batch.enableBlending();
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

【问题讨论】:

  • 我没有看到任何设置混合功能甚至启用混合的代码。默认的混合函数是 SrcRGBA * 1.0 + DestRGB[A] * 0.0,这基本上意味着:“忘记之前帧缓冲区中的任何内容,并替换它!” - 因为这显然没有发生在这里,你正在代码中的某个地方设置混合,但没有显示在哪里;)
  • @AndonM.Coleman 我不知道你是否在讽刺,但我添加了我的混合设置代码
  • 不,我是真诚的。无论如何,现在设置的方式是,您告诉 GL 采用 SrcRGBA * 0.5 + 0.5 * DestRGBA。考虑到您使用的参数,这对我来说看起来很正常。你想要的结果是什么?
  • 根据代码,这是可以预期的吧?你到底想达到什么(期望的结果)?
  • 我想要的结果是阴影在白色背景上显示为灰色

标签: java opengl libgdx framebuffer


【解决方案1】:

不要将阴影缓冲区清除为黑色,将其清除为透明并用黑色绘制阴影。也不要忘记选择正确的混合功能。如果你使用这种方法,你的参数会像

spritebatch.enableBlending(); spritebatch.setBlendFunction(gl.BLEND_SRC_ALPHA,gl.BLEND_ONE_MINUS_SRC_ALPHA);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多