Libgdx使用findRegion从Texture Atlas获取纹理

时间:2018-03-20 10:35:17

标签: libgdx

我有这段代码

textureAtlas = TextureAtlas("atlas.atlas")

val box = textureAtlas.findRegion("box")

我想用" box"创建一个纹理。可能吗? box.texture返回原始纹理,而不是区域化。哦,我不想使用Sprite和SpriteBatch。我需要3D,而不是2D。

由于

2 个答案:

答案 0 :(得分:1)

TextureAtlas实际上不会分割碎片。当你从地图集获得区域时,它只是说这是你要使用的区域(u,v,u2,v2),这是对整个纹理的原始参考。

这就是batch.draw(Texture)和batch.draw(TextureRegion)在使用中不相同的原因。

然而,将纹理部分视为纹理是可能的。

  • 您可以使用pixmap来完成它。

    首先从atlas纹理生成像素图。然后创建所需大小为“box”区域的新空像素图。然后分配像素数组并从新的像素图生成纹理。

由于您的Textureatlas尺寸,它可能相当昂贵。

  • 您可以使用framebuffer。 创建FBbuilder并构建新的帧缓冲区。将纹理区域绘制到此缓冲区并从中获取纹理。

这里的问题是纹理的大小将与视口/屏幕大小相同。我猜你可以创建新的相机将其更改为你想要的大小。

GLFrameBuffer.FrameBufferBuilder frameBufferBuilder = new GLFrameBuffer.FrameBufferBuilder(widthofBox, heightofBox);
    frameBufferBuilder.addColorTextureAttachment(GL30.GL_RGBA8, GL30.GL_RGBA, GL30.GL_UNSIGNED_BYTE);
    frameBuffer = frameBufferBuilder.build();
    OrthographicCamera c = new OrthographicCamera(widthofBox, heightofBox);
    c.up.set(0, 1, 0);
    c.direction.set(0, 0, -1);
    c.position.set(widthofBox / 2, heightofBox / 2, 0f);
    c.update();
    batch.setProjectionMatrix(c.combined);
    frameBuffer.begin();
    batch.begin();
    batch.draw(boxregion...)
    batch.end();
    frameBuffer.end();
    Texture texturefbo = frameBuffer.getColorBufferTexture();

Texturefbo将被翻转。您可以通过将scaleY设置为-1来修复纹理绘制方法,或者在绘制帧缓冲区时可以将scaleY缩放为-1,或者可以像这样更改相机

up.set(0, -1, 0);
direction.set(0, 0, 1);

在y轴上翻转相机。

最后我想到的是mipmapping这个纹理。它也不那么难。

    texturefbo.bind();
    Gdx.gl.glGenerateMipmap(GL20.GL_TEXTURE_2D);
    texturefbo.setFilter(Texture.TextureFilter.MipMapLinearLinear, 
    Texture.TextureFilter.MipMapLinearLinear);

答案 1 :(得分:-2)

你可以这样做:

Texture boxTexture = new TextureRegion(textureAtlas.findRegion("box")).getTexture();