Libgdx使用findRegion从纹理图集获取纹理

Libgdx使用findRegion从纹理图集获取纹理,libgdx,Libgdx,我有这个密码 textureAtlas = TextureAtlas("atlas.atlas") val box = textureAtlas.findRegion("box") 我想用“盒子”创建一个纹理。可能吗?返回原始纹理,而不是区域化纹理。哦,我不想用雪碧和雪碧棒。我需要3D的,不是2D的 谢谢您可以这样做: Texture boxTexture = new TextureRegion(textureAtlas.findRegion("box")).getTexture(); 纹

我有这个密码

textureAtlas = TextureAtlas("atlas.atlas")

val box = textureAtlas.findRegion("box")
我想用“盒子”创建一个纹理。可能吗?返回原始纹理,而不是区域化纹理。哦,我不想用雪碧和雪碧棒。我需要3D的,不是2D的

谢谢

您可以这样做:

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

纹理实际上并没有把碎片分开。当你从atlas中获取区域时,它只是说这是你要使用的区域(u,v,u2,v2),这是整个纹理的原始参考

这就是为什么batch.draw(纹理)和batch.draw(纹理区域)在使用中不一样的原因

然而,将图片的一部分作为纹理是可能的

  • 您可以使用pixmap来完成

    首先从atlas纹理生成pixmap。然后创建新的空pixmap,大小为您想要的“box”区域。然后指定像素阵列并从新的像素贴图生成纹理

这可能是相当昂贵的,因为你的纹理大小

  • 您可以使用帧缓冲区。 创建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将被y翻转。您可以通过将scaleY设置为-1来使用纹理绘制方法解决此问题,或者在帧缓冲区上绘制时将scaleY缩放为-1,或者可以像这样更改摄影机

up.set(0, -1, 0);
direction.set(0, 0, 1);
在y轴上翻转到摄影机

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

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

如果在3D中使用,则没有理由使用TextureAtlas。您无法从TextureRegion提取纹理,因此您需要直接使用Pixmap并从源图像文件的某个区域创建新的Pixmap,或者对网格执行一些奇特的UV操作以使其使用该特定区域。这是整个纹理,而不是区域纹理,我想我必须为此创建一个自定义着色器