Фреймбуфер LibGDX

#libgdx

#libgdx

Вопрос:

Я пытаюсь создать игру, в которой вы строите космический корабль из частей, летаете на нем и тому подобное.

Я хотел бы создать корабль из серии компонентов (например, из TextureAtlas). Я хотел бы нарисовать корабль из его текстур компонентов, а затем сохранить нарисованный корабль как одну большую текстуру. (Поэтому мне не нужно рисовать 50 текстур компонентов, только одну текстуру корабля. Каков был бы наилучший способ сделать это?

Я пытался сделать это с помощью фреймбуфера. Я смог нарисовать компоненты в текстуре и нарисовать текстуру на экране, но независимо от того, что я пытаюсь, текстура заканчивается сплошным фоном размером с буфер кадров. Это похоже на то, что команда clear не может очистить с прозрачностью. Вот код чертежа, который у меня есть на данный момент. Корабль — это просто спрайт, в который я сохраняю текстуру фреймбуфера.

 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 , но я никогда не использовал его сам, поищите учебник по нему!

Ответ №1:

Проблема здесь заключается в этой строке:

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

в частности, с Format.RGB888 помощью . В этой строке говорится, что ваш фреймбуфер должен быть красным (8 бит), за которым следует зеленый (8 бит), а затем синий (8 бит). Обратите внимание, однако, что в этом формате нет битов для альфа (прозрачности). Чтобы получить прозрачность из вашего фреймбуфера, вы, вероятно, вместо этого захотите использовать Format.RGBA8888 , который включает дополнительные 8 бит для альфа.

Надеюсь, это поможет.

Комментарии:

1. Спасибо! По какой-то причине я подумал, что 888 имеет отношение к чему-то, связанному с альфой. Итак, вы также сообщили мне, как описываются форматы. Спасибо!