在LibGDX中组合多个材质\纹理

时间:2013-08-06 08:41:07

标签: java 3d 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 个答案:

答案 0 :(得分:2)

每个NodePart只能有一个材质(这是要渲染的实际网格/材质组合)。

如果您只想渲染模型两次,但第二次使用不同的纹理。您还可以创建两个ModelInstances,并像上面一样在每个上设置纹理。

如果您不想创建两个ModelInstances,您还可以复制模型(或modelinstance)中的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两次)可能无法正常工作。如果它有效,我不会推荐它。相反,你应该使用着色器来组合两个纹理。

每个材质属性基本上代表着色器的一致性。如果要组合两个纹理,则必须创建一个实现实际渲染的着色器。接下来,您可以向着色器添加两个TextureAttributes(不同类型)以供着色器使用。请看一下:http://blog.xoppa.com/using-materials-with-libgdx/,其中详细解释了这个例子。