在我的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中做到吗?
答案 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/,其中详细解释了这个例子。