Я рендерирую спрайты (игровые карты с одним изображением и таблицей) на 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();
}