有没有办法用libgdx API将一些纹理组合成一个纹理?
例如,考虑使用这3种纹理:
Texture texture1 = new Texture("texture1.png");
Texture texture2 = new Texture("texture2.png");
Texture texture3 = new Texture("texture3.png");
目标是将它们组合成一个可用的纹理,有没有办法做到这一点?
答案 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图像,其中透明部分由背景颜色填充。