2013-08-06 40 views
2

在我的libgdx項目中,我正在嘗試向模型中添加其他材質。實際上,我需要獲得紋理組合 - 以下材質的紋理必須放置在前一個紋理上。在某些情況下具有透明度。在LibGDX中合併多個材質紋理

類似的東西

Model knight = assets.get("data/g3d/knight.g3db", Model.class); 
    knightInstance = new ModelInstance(knight); 

    Material additionalMaterial = new Material(); 
    knightInstance.materials.add(additionalMaterial); 

    knightInstance.materials.get(0).clear(); 
    knightInstance.materials.get(0).set(TextureAttribute.createDiffuse(assets.get("data/g3d/checkboard.png", Texture.class))); 
    BlendingAttribute blendingAttribute1 = new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, 0.4f); 
    knightInstance.materials.get(0).set(blendingAttribute1); 

    knightInstance.materials.get(1).clear(); 
    knightInstance.materials.get(1).set(TextureAttribute.createDiffuse(assets.get("data/g3d/tiles.png", Texture.class))); 
    BlendingAttribute blendingAttribute2 = new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, 0.6f); 
    knightInstance.materials.get(1).set(blendingAttribute2); 

Offcorse,它不工作。只有第一種材料可見。 在LibGDX中可以做到嗎?

回答

1

您只能爲每個NodePart(這是所呈現的實際網格/材質組合)提供一個材質。

如果您只想渲染模型兩次,但第二次使用不同的紋理。您也可以創建兩個ModelInstances,並像上面那樣設置每個紋理。

如果您不想創建兩個ModelInstances,也可以在模型(或模型實例)內複製NodePart。假設你的模型具有一個部分一個節點,這可以這樣進行:

Model knight = assets.get(...); 
NodePart part1 = knight.nodes.get(0).parts.get(0); 
NodePart part2 = new NodePart(part1.meshPart, new Material()); 
knight.nodes.get(0).parts.add(part2); 
part1.material.set(TextureAttribute.createDiffuse(texture1)); 
part2.material.set(TextureAttribute.createDiffuse(texture2)); 

注意,這將消除任何換膚/骨頭從第二NodePart信息。如果你的模型是動畫/皮膚,你需要複製骨骼數組並綁定姿勢。

根據深度測試,此方法(渲染NodePart兩次)可能不會像您期望的那樣工作。如果它有效,我不會推薦它。相反,您應該使用着色器來組合這兩個紋理。

每個材質屬性基本上代表着色器的統一。如果你想合併兩個紋理,你將不得不創建一個實現實際渲染的着色器。接下來,您可以將兩個TextureAttribute(不同類型)添加到您的材質以供着色器使用。看看:http://blog.xoppa.com/using-materials-with-libgdx/這裏詳細解釋這包括一個例子。