Libgdx帧缓存混合不起作用

问题描述:

我正在尝试在我的游戏中制作动态2D阴影。Libgdx帧缓存混合不起作用

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

enter image description here

然后用于调试目的,我呈现其被清除白色每一帧上的另一个帧缓冲器的顶部的帧缓冲器的内容,然后渲染对这个帧我的游戏。

enter image description here

但如果我绘制阴影在第二帧缓存之前做到这一点,

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

的:我渲染100%不透明度阴影这只是正常的......只要透明的阴影贯穿帧缓冲器,你可以看到下面的游戏世界。

enter image description here

这里是我的代码:

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

我看不出有任何的代码,你设置的混合功能,甚至能融合。默认的混合函数是SrcRGBA * 1.0 + DestRGB [A] * 0.0,它基本上意味着:“忘掉之前在帧缓冲区中的任何东西,并替换它!” - 因为这里显然没有发生,你正在代码中的某处设置混合,但没有显示出位置;) –

+0

@ AndonM.Coleman我不知道你是否在讽刺,但我添加了混合设置代码 – Entity

+0

不,我当时是真的。无论如何,现在事情的设置方式,你告诉GL采取SrcRGBA * 0.5 + 0.5 * DestRGBA。根据您使用的参数,这看起来很正常。你期望的结果是什么? –

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

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