我正试图在游戏中制作动态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);
答案 0 :(得分:0)
不要将阴影缓冲区清除为黑色,将其清除为透明并用黑色绘制阴影。另外别忘了选择合适的混合功能。如果您使用此方法,您的参数将类似于
spritebatch.enableBlending();
spritebatch.setBlendFunction(gl.BLEND_SRC_ALPHA,gl.BLEND_ONE_MINUS_SRC_ALPHA);