有没有一种方法可以使用 libgdx API 将多个纹理组合成一个纹理?

问题描述 投票:0回答:5

有没有一种方法可以使用 libgdx API 将多个纹理组合成一个纹理?

例如,考虑使用以下 3 个纹理:

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

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

java libgdx
5个回答
2
投票

我想得到相同的结果,但我发现前面的说明没有任何帮助。我也无法找到任何其他明确的解决方案来解决这个问题,所以这是我在阅读了一些 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 图像,其中透明部分由背景颜色填充。


2
投票

@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;
}

0
投票

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

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

您还应该记住,大多数 Android 和 IOS 设备的一个纹理的最大尺寸是:

2048x2048


0
投票

如果您想使用组合纹理作为图集来提高性能,您最好使用@Alon Zilberman 答案。

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


-1
投票

使用像素图


扩展功能在中心组合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次

© www.soinside.com 2019 - 2024. All rights reserved.