LibGDX帧缓冲区

7

我正在尝试制作一款太空飞船游戏,玩家可以使用各种零件来构建飞船并进行飞行等活动。

我希望从一系列组件(例如TextureAtlas)中创建飞船。我想要从组件纹理绘制飞船,然后将绘制好的飞船保存为一个大的纹理。(这样我就不需要绘制50个组件纹理,只需一个飞船纹理即可)。请问有什么最好的方法可以做到这一点?

我一直在尝试使用FrameBuffer来实现。我已经能够将组件绘制到纹理上,并将纹理绘制到屏幕上,但无论我尝试什么,纹理都会以帧缓冲区大小为背景色填充。就像清除命令不能清除透明度一样。以下是我目前的绘图代码。飞船只是Sprite,我将FrameBuffer纹理保存到其中。

public void render(){

    if (ship == null){
        int screenwidth = Gdx.graphics.getWidth();
        int screenheight = Gdx.graphics.getHeight();

        SpriteBatch fb = new SpriteBatch();

        FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);

        fbo.begin();

        fb.enableBlending();
        Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);

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

        fb.begin();

        atlas.createSprite("0").draw(fb);

        fb.end();

        fbo.end();

        ship = new Sprite(fbo.getColorBufferTexture());
        ship.setPosition(0, -screenheight);
    }

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

    batch.begin();

    batch.enableBlending();
    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ZERO);
    ship.draw(batch);
    batch.end();
}

1
我认为你正在寻找 PixMap,但是我自己从未使用过它,请寻找相关教程! - Robert P
1个回答

16

这里的问题在于这一行:

 FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);

该行代码使用Format.RGB888来指定格式。这意味着你的帧缓冲应该是红色(8位)接着绿色(8位)再接着蓝色(8位)。然而请注意,这种格式没有任何位用于Alpha(透明度)。如果您想从帧缓冲区中得到透明度,则应该使用Format.RGBA8888,其中包括额外的8位Alpha。

希望这有所帮助。


谢谢!由于某种原因,我认为888与字母表中的某些内容有关。所以您还告诉了我格式是如何描述的。谢谢! - loogie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接