有没有一种方法可以使用 libgdx API 将多个纹理组合成一个纹理?
例如,考虑使用以下 3 个纹理:
Texture texture1 = new Texture("texture1.png");
Texture texture2 = new Texture("texture2.png");
Texture texture3 = new Texture("texture3.png");
目标是将它们组合成一个可用的纹理。有办法做到这一点吗?
我想得到相同的结果,但我发现前面的说明没有任何帮助。我也无法找到任何其他明确的解决方案来解决这个问题,所以这是我在阅读了一些 api 文档并做了一些我自己的测试后设法得到的工作。
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 图像,其中透明部分由背景颜色填充。
@Ville Myrskyneva 的答案有效,但它并没有完全展示如何组合 2 个或更多纹理。我创建了一个实用程序方法,它接受 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;
}
您应该使用TexturePacker从许多小纹理创建一个大纹理。 https://github.com/libgdx/libgdx/wiki/Texture-packer。
这是 GUI 版本(jar),它将帮助您将所有纹理打包到一个中,然后再将它们放入您的项目中:https://code.google.com/p/libgdx-texturepacker-gui/.
您还应该记住,大多数 Android 和 IOS 设备的一个纹理的最大尺寸是:
2048x2048
。
如果您想使用组合纹理作为图集来提高性能,您最好使用@Alon Zilberman 答案。
但我认为你的问题是关于另一个问题。如果您想从这三个纹理中获取一些自定义纹理(例如,通过逐一绘制来合并它们),那么最好的解决方案是绘制到 FrameBuffer。在这里您可以找到如何执行此操作的很好的示例https://stackoverflow.com/a/7632680/3802890
扩展功能在中心组合2个纹理。
fun Texture.combineByCenter(texture: Texture): Texture {
if (textureData.isPrepared.not()) textureData.prepare()
val pixmap1 = textureData.consumePixmap()
if (texture.textureData.isPrepared.not()) texture.textureData.prepare()
val pixmap2 = texture.textureData.consumePixmap()
pixmap1.drawPixmap(pixmap2,
(width / 2) - (texture.width / 2),
(height / 2) - (texture.height / 2),
)
val textureResult = Texture(pixmap1)
if (pixmap1.isDisposed.not()) pixmap1.dispose()
if (pixmap2.isDisposed.not()) pixmap2.dispose()
return textureResult
}
不要忘记稍后处置纹理。
如果在合并之前至少有一个 textures 具有 pixmap.dispose [pixmap.isDispose=true],那么你就会遇到问题。 解决方案只是使用纯纹理及其像素图,因为它们被创建并处理了1次。