libGDX帧缓冲区Alpha问题

MSD

我在使用libGDX FrameBuffer和Alpha时遇到问题。以下是预期结果和实际结果的两个图像。有人可以告诉我我在做什么错吗,我该如何纠正。这是代码:

FrameBuffer buffer;
Sprite sprite;

SpriteBatch batch;
Texture texture1;
Texture texture2;
Texture texture3;
Sprite texture2Sprite;

@Override
public void create () {
    batch = new SpriteBatch();

    texture1 = new Texture("1.png");
    texture2 = new Texture("2.png");
    texture3 = new Texture("3.png");

    texture2Sprite = new Sprite(texture2);
    texture2Sprite.setAlpha(0.5f);
    texture2Sprite.setPosition(100, 100);

    buffer = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
    sprite = new Sprite(buffer.getColorBufferTexture());
    sprite.flip(false, true);
}

public void createFBO()
{
    buffer.begin();

    Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    batch.draw(texture1, 0f, 0f);

    texture2Sprite.draw(batch);

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

@Override
public void render () {

    createFBO();

    Gdx.gl.glClearColor(0f, 0f, 1f, 1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    batch.enableBlending();
    batch.draw(texture3, 200, 200);
    sprite.draw(batch);

    batch.end();
}

预期结果 预期结果

实际结果 实际结果

哈姆汉姆

我几乎用半透明的颜色相同的问题FrameBuffer,问题和解决方案,你可以在我的badlogic论坛主题找到这里

基本上,您需要FrameBuffer在预乘alpha状态下进行绘制您可以通过创建自定义片段着色器来实现此目的(我的完整代码在该主题上)。然后,将混合模式设置为匹配(GL_ONE,GL_ONE_MINUS_SRC_ALPHA)。

然后使用相同的混合函数但使用默认着色器绘制精灵。您应该得到这样的结果:

public void createFBO(){
    buffer.begin();
    batch.begin();

    Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.setShader(pmaShaderProgram); //pre-multiplied alpha ShaderProgram
    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
    batch.draw(texture1, 0f, 0f);
    texture2Sprite.draw(batch);
    batch.setShader(null); //default ShaderProgram
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); //default blend mode

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

@Override
public void render () {
    createFBO();

    batch.begin();
    batch.enableBlending();

    Gdx.gl.glClearColor(0f, 0f, 1f, 1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.draw(texture3, 200, 200);

    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
    sprite.draw(batch);
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

    batch.end();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

libGDX帧缓冲区Alpha问题

来自分类Dev

LibGDX帧缓冲区

来自分类Dev

OpenGL帧缓冲区+ LibGDX

来自分类Dev

深度+模板帧缓冲区问题

来自分类Dev

我的帧缓冲区出了什么问题?

来自分类Dev

OpenGL缓冲区问题

来自分类Dev

修改Alpha值时,帧缓冲区的RGB颜色不同

来自分类Dev

什么是深帧缓冲区?

来自分类Dev

什么是“哑”帧缓冲区?

来自分类Dev

复制并粘贴到帧缓冲区

来自分类Dev

处理大于缓冲区大小的帧

来自分类Dev

什么是深帧缓冲区?

来自分类Dev

什么是内核帧缓冲区?

来自分类Dev

OpenGL帧缓冲区绑定目标

来自分类Dev

什么是“哑”帧缓冲区?

来自分类Dev

在绘制到帧缓冲区纹理时遇到问题。它画空白

来自分类Dev

字节帧缓冲区数组填充命令的堆栈溢出问题

来自分类Dev

WebGL将纹理帧缓冲区复制到纹理帧缓冲区?

来自分类Dev

使用WebGL2通过Alpha混合渲染到帧缓冲区时的伪像

来自分类Dev

Android OpenSLES缓冲区饥饿问题

来自分类Dev

Python,Macports和缓冲区问题

来自分类Dev

JavaFX 8 Z缓冲区问题

来自分类Dev

C基本环形缓冲区问题

来自分类Dev

关于Vi / Vim缓冲区的问题

来自分类Dev

GetProcessImageFileNameA 问题,缓冲区大小不足

来自分类Dev

缓冲区溢出问题

来自分类Dev

将可见帧缓冲区读取到像素缓冲区对象

来自分类Dev

具有多个绘制缓冲区的帧缓冲区

来自分类Dev

如何从多重采样缓冲区绘制到默认帧缓冲区