Спрайты Libgdx для рисования и упаковки на Android чёрные - PullRequest
0 голосов
/ 30 декабря 2018

Я рендерирую спрайты (игровые карты с одним изображением и таблицей) на Android для игры, а затем упаковываю их в PixmapPacker.Когда я запускаю код с эмулятором Android, спрайты хорошо рисуются в png-файле атласа, но фон файла полностью черный с некоторыми блестящими желтыми пикселями на стороне спрайтов.Запуск одного и того же кода на моем телефоне приводит к почти полностью черному png со всеми моими спрайтами черного цвета (отображается только мой «back.png»).

Правильно ли я очистил все буферы или я что-то не так делаю спорядка m_fbo.begin() и m_fbo.end()?Также я не уверен, нужно ли каждый раз вызывать spriteBatch.begin() и spriteBatch.end() внутри цикла.

Любая помощь будет очень признательна.

Sprite sprite;
BitmapFont font;

Texture texture;
OrthographicCamera cam;
FrameBuffer m_fbo = null;
SpriteBatch spriteBatch;
Pixmap pixmap;
Skin skin;

public AtlasGenerator() {
    cam = new OrthographicCamera(w, h);
    cam.position.set(new Vector2(w / 2, h / 2), 1);
    cam.update();

    PixmapPacker packer = new PixmapPacker(packer_width, packer_height, Pixmap.Format.RGB565, padding, true);
    //packer.setTransparentColor(Color.BLACK); // Is this necessary?
    font = new BitmapFont();
    spriteBatch = new SpriteBatch();
    cam.update();
    spriteBatch.setProjectionMatrix(cam.combined);

    Table table = new Table(skin);
    m_fbo = new FrameBuffer(Pixmap.Format.RGB565, w, h, false);
    m_fbo.begin();

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    Gdx.gl.glClearColor(1f, 1f, 1f, 1);
    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    //Gdx.gl.glColorMask(false, false, false, true);

    int cardsCounter = game.getCounter();
    for (int cardID = 0; cardID < cardsCounter; cardID++) {
        System.out.println("Generating card " + (cardID + 1) + " of " + cardsCounter);

        texture = new Texture(Gdx.files.internal(game.get(cardID).getImages().get(0).getFilename()));
        sprite = new Sprite(texture);

        /* adding data to table here...*/

        /* Rendering */
        spriteBatch.begin();
        Gdx.gl.glClear(GL_COLOR_BUFFER_BIT);
        Gdx.gl.glClearColor(1f, 1, 1, 1f);

        spriteBatch.draw(sprite, 0, h - newh, neww, newh);
        table.draw(spriteBatch, 1f);
        spriteBatch.end();

        ByteBuffer buf;
        pixmap = new Pixmap(w, h, Pixmap.Format.RGB888);
        buf = pixmap.getPixels();
        Gdx.gl.glReadPixels(1, 1, w, h, GL20.GL_RGB, GL20.GL_UNSIGNED_BYTE, buf);
        pixmap = flipPixmap(pixmap);

        // convert pixmap to RGB565
        Pixmap.Format format = Pixmap.Format.RGB565; //desired format
        if (pixmap.getFormat()!=format) { //perform conversion if necessary
            Pixmap tmp = new Pixmap(pixmap.getWidth(), pixmap.getHeight(), format);
            tmp.drawPixmap(pixmap, 0, 0); //copy pix to tmp
            pixmap.dispose(); //dispose old pix
            pixmap = tmp; //swap values
        }

        //packer.updatePageTextures();
        //packer.updateTextureAtlas();
        //packer.updateTextureRegions();

        packer.pack(String.valueOf(cardID), pixmap);
    }
    m_fbo.end();

    System.out.println("Finished generating cards");
    System.out.println("Start generating card pack...");

    PixmapPackerIO.SaveParameters saveParameters = new PixmapPackerIO.SaveParameters();
    saveParameters.magFilter = Texture.TextureFilter.Nearest;
    saveParameters.minFilter = Texture.TextureFilter.Nearest;
    packer.pack("back", new Pixmap(Gdx.files.internal("back.png")));
    PixmapPackerIO pixmapPackerIO = new PixmapPackerIO();
    try {
        pixmapPackerIO.save(Gdx.files.external("cards.atlas"), packer, saveParameters);
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("Finished generating card pack");
    packer.dispose();
    dispose();
}

1 Ответ

0 голосов
/ 30 декабря 2018

Я исправил это, удалив код OpenGL и работая с TextureRegion:

        m_fboRegion = new TextureRegion(m_fbo.getColorBufferTexture());
        m_fboRegion.flip(false, true);
        m_fbo.begin();
        Gdx.gl.glClearColor(1f, 1f, 1f, 1);
        Gdx.gl.glClear(GL_COLOR_BUFFER_BIT);

        /* adding some data to sprite and table */

        spriteBatch.begin();
        Gdx.gl.glClear(GL_COLOR_BUFFER_BIT);
        Gdx.gl.glClearColor(1f, 1, 1, 1f);
        spriteBatch.draw(sprite, 0, h - newh, neww, newh);
        table.draw(spriteBatch, 1f);
        spriteBatch.end();

        pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, w, h);
        pixmap = flipPixmap(pixmap);

        m_fbo.end();
...