如何在libgdx 3D中使用TextureAtlas中的纹理

3

我试图从使用单独的纹理转变为使用纹理图集来为我的盒子创建材质(它们都显示类似于Scrabble的游戏中的单个字母)。但我卡在这里了,我找到的所有示例都是针对2D精灵的。

我该如何创建并分配材质给一个3D表面,并使用来自AtlasRegion的正确映射坐标?

public void createModelInstance(TextureAtlas letterAtlas) {
   AtlasRegion region = letterAtlas.findRegion(this.textureID);
   Material mat = new Material(???);
   modelInstance = new ModelInstance(modelTile); 
   modelInstance.nodes.get(0).parts.get(0).material.set(mat);
}

当每个纹理都使用单独的文件时,它可以正常工作:
Material mat = new Material(TextureAttribute.createDiffuse(
    assetManager.get("textures/" + textureFile, Texture.class));

表面被创建:
MeshPartBuilder tileBuilder;
tileBuilder = modelBuilder.part("top", GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, new Material(ColorAttribute.createDiffuse(Color.WHITE)));
tileBuilder.rect(-0.45f, 0.1f, 0.45f,   0.45f, 0.1f, 0.45f,    0.45f, 0.1f, -0.45f,  -0.45f, 0.1f, -0.45f,  0f, 1f, 0f);
...

1
如果您需要纹理,可以从TextueAtlas.getTexture获取纹理,同时您也可以将纹理传递给自定义着色器。 - daniel
1个回答

1
我认为目前无法以这种方式使用TextureAtlas。创建TextureAttribute的唯一可能方法是提供一个Texture。纹理是一个独立的PixMap
相比之下,TextureRegion描述了一个更大的Texture的区域。目前似乎没有办法从API中创建一个Texture,因为TextureRegion.getTexture()只会检索它所来自的图集的完整纹理。
实际上,API不提供这样的转换是有道理的,因为它破坏了图集的目的。通过使所有区域成为独立的纹理,您将不再获得任何性能优势。 TextureAttribute目前似乎完全缺少对纹理图集的支持,否则它将不得不提供使用TextureRegion而不是Textures的方法。

1
这种情况已经不再存在了。现在所有的工厂方法都有一个TextureRegion版本,并且有一个通用构造函数,它接受一个类型和一个TextureRegion - Chris Bode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接