我正在尝试在游戏中制作动态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);

最佳答案

不要将shadowbuffer清除为黑色,将其清除为透明并用黑色绘制阴影。同样不要忘记选择正确的混合功能。如果使用此方法,您的参数将像

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

10-08 16:42