【问题标题】:Libgdx draw and pack sprites are black on AndroidLibgdx 绘制和打包精灵在 Android 上是黑色的
【发布时间】:2019-05-27 03:47:50
【问题描述】:

我在 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();
}

【问题讨论】:

  • 您可以尝试的一件事是更改 Pixmap.Format。 libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/… 表示其中只有 3 个是“可渲染颜色的”。这只是一个猜测,我认为我无法为您提供更多帮助,因为我不处理您正在使用的一半课程。
  • 我为我的像素图添加了一个到 RGB.565 的转换,但结果没有改变。无论如何,谢谢。
  • 这可能与Gdx.gl.glReadPixels() 有关,如本文所述:badlogicgames.com/forum/viewtopic.php?f=11&t=20779 但我不知道如何结合我自己的FrameBuffer 对象来解决这个问题。

标签: android opengl-es libgdx game-development


【解决方案1】:

我通过删除 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();

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2013-08-03
    相关资源
    最近更新 更多