libgdx - 将多个纹理合并为一个

时间:2014-08-12 05:49:58

标签: java libgdx

有没有办法用libgdx API将一些纹理组合成一个纹理?

例如,考虑使用这3种纹理:

Texture texture1 = new Texture("texture1.png");
Texture texture2 = new Texture("texture2.png");
Texture texture3 = new Texture("texture3.png");

目标是将它们组合成一个可用的纹理,有没有办法做到这一点?

4 个答案:

答案 0 :(得分:1)

你应该使用TexturePacker从许多小纹理创建一个大纹理。 https://github.com/libgdx/libgdx/wiki/Texture-packer

这里是GUI版本(jar),它将帮助您将所有纹理打包成一个,然后再将它们放入项目中:https://code.google.com/p/libgdx-texturepacker-gui/

您还应该记住,大多数Android和IOS设备的最大尺寸为:2048x2048

答案 1 :(得分:1)

如果您想使用组合纹理作为图册来获得性能优势,最好使用@Alon Zilberman答案。

但我认为你的问题是另一个问题。如果你想从这三个纹理中获得一些自定义纹理(例如通过一对一来合并它们),那么你最好的解决方案是绘制到FrameBuffer。在这里,你可以找到如何做到这一点的很好的例子https://stackoverflow.com/a/7632680/3802890

答案 2 :(得分:1)

@Ville Myrskyneva的答案有效,但并未完全显示如何组合2个或更多纹理。我制作了一个Utility方法,该方法将2个纹理作为输入并返回组合的纹理。请注意,第二个纹理将始终绘制在第一个纹理的顶部。

public static Texture combineTextures(Texture texture1, Texture texture2) {
    texture1.getTextureData().prepare();
    Pixmap pixmap1 = texture1.getTextureData().consumePixmap();

    texture2.getTextureData().prepare();
    Pixmap pixmap2 = texture2.getTextureData().consumePixmap();

    pixmap1.drawPixmap(pixmap2, 0, 0);
    Texture textureResult = new Texture(pixmap1);

    pixmap1.dispose();
    pixmap2.dispose();

    return textureResult;
}

答案 3 :(得分:0)

我想得到相同的结果,但我没有发现之前的指示给予任何帮助。我没有找到任何其他明确的解决方案来解决这个问题,所以我在阅读了一些api-docs并对自己进行了一些测试之后,设法开始工作了。

Texture splashTexture = new Texture("texture1.png"); // Remember to dispose
splashTexture.getTextureData().prepare(); // The api-doc says this is needed
Pixmap splashpixmap = splashTexture.getTextureData().consumePixmap(); // Strange name, but gives the pixmap of the texture. Remember to dispose this also
Pixmap pixmap = new Pixmap(splashTexture.getWidth(), splashTexture.getHeight(), Format.RGBA8888); // Remember to dispose
// We want the center point coordinates of the image region as the circle origo is at the center and drawn by the radius
int x = (int) (splashTexture.getWidth() / 2f);
int y = (int) (splashTexture.getHeight() / 2f);
int radius = (int) (splashTexture.getWidth() / 2f - 5); // -5 just to leave a small margin in my picture
pixmap.setColor(Color.ORANGE);
pixmap.fillCircle(x, y, radius);
// Draws the texture on the background shape (orange circle)
pixmap.drawPixmap(splashpixmap, 0, 0);
// TADA! New combined texture
this.splashImage = new Texture(pixmap); // Not sure if needed, but may be needed to get disposed as well when it's no longer needed
// These are not needed anymore
pixmap.dispose();
splashpixmap.dispose();
splashTexture.dispose();

然后使用splashImage(在我的例子中是Texture类型的类变量)将组合图像渲染到您想要的位置。生成的图像具有给定的背景,前景是png图像,其中透明部分由背景颜色填充。