LibGDX FrameBuffer

loo*_*gie 6 libgdx

我正在尝试制作一个游戏,你可以用零件制造宇宙飞船,然后飞来飞去.

我想从一系列组件(例如,来自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();
  }
    }
Run Code Online (Sandbox Code Playgroud)

cle*_*m23 14

这里的问题在于这一行:

 FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);
Run Code Online (Sandbox Code Playgroud)

特别是Format.RGB888.这一行表示你的FrameBuffer应该是红色(8位),然后是绿色(8位),然后是蓝色(8位).但请注意,此格式没有Alpha(透明度)的任何位.为了从帧缓冲区中获得透明度,您可能需要使用Format.RGBA8888,其中包括Alpha的额外8位.

希望这可以帮助.