我有这段代码
textureAtlas = TextureAtlas("atlas.atlas")
val box = textureAtlas.findRegion("box")
我想用" box"创建一个纹理。可能吗? box.texture返回原始纹理,而不是区域化。哦,我不想使用Sprite和SpriteBatch。我需要3D,而不是2D。
由于
答案 0 :(得分:1)
TextureAtlas实际上不会分割碎片。当你从地图集获得区域时,它只是说这是你要使用的区域(u,v,u2,v2),这是对整个纹理的原始参考。
这就是batch.draw(Texture)和batch.draw(TextureRegion)在使用中不相同的原因。
然而,将纹理部分视为纹理是可能的。
您可以使用pixmap来完成它。
首先从atlas纹理生成像素图。然后创建所需大小为“box”区域的新空像素图。然后分配像素数组并从新的像素图生成纹理。
由于您的Textureatlas尺寸,它可能相当昂贵。
这里的问题是纹理的大小将与视口/屏幕大小相同。我猜你可以创建新的相机将其更改为你想要的大小。
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();