如何从Blender导出fbx纹理以在Monogame中使用

时间:2019-04-27 14:52:03

标签: visual-studio xna blender monogame fbx

我正在尝试使用Blender制作一张简单的扑克牌,该扑克牌的正面和背面各侧都有纹理,并将其加载到Monogame中。该模型本身很好,可以在运行时显示在模拟器上,但是我似乎无法获得包含的纹理。

Genymotion emulator

卡片上的纹理在Blender中似乎可以正常显示。材质设置为“无阴影”,这样它们就不会受到正确的光照水平的影响吗?

Card in Blender

导出文件时,我尝试使用不同的版本设置和从“复制”到“条带路径”的各种不同路径模式。

Export FBX settings

内容管理器将输出目录设置为主内容文件夹,因此我希望纹理不会出现引用问题。

Content manager

所有纹理本身都在同一文件夹中。

Textures

所有内容均手动加载到Visual Studio中。

Solution Explorer

这是我用来绘制卡片的代码,显示了我玩过的不同的灯光设置。

    private void DrawCard(Model m, Vector3 v, CardFacing c, PlayerFacing p)
    {
        foreach (var mesh in m.Meshes)
        {
            foreach (var effect1 in mesh.Effects)
            {
                var effect = (BasicEffect)effect1;

                effect.TextureEnabled = true;
                effect.EnableDefaultLighting();
                //effect.PreferPerPixelLighting = true;

                //effect.AmbientLightColor = Color.White.ToVector3();
                effect.DiffuseColor = Color.White.ToVector3();
                //effect.EmissiveColor = Color.White.ToVector3() * 2f;

                //effect.DirectionalLight0.Direction = Vector3.Normalize(new Vector3(0, 0, 1));

                effect.Alpha = 1;
                effect.VertexColorEnabled = false;

                Matrix mCardFacing = new Matrix();

                switch(c)
                {
                    case CardFacing.Down:
                        mCardFacing = Matrix.CreateRotationY((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
                        break;
                    case CardFacing.Up:
                        mCardFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
                        break;
                    case CardFacing.Hand:
                        mCardFacing = Matrix.CreateRotationX((float)(Math.PI / 180) * -20);
                        break;
                }

                Matrix mPlayerFacing = new Matrix();

                switch (p)
                {
                    case PlayerFacing.North:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 0);
                        break;
                    case PlayerFacing.East:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 90);
                        break;
                    case PlayerFacing.South:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180);
                        break;
                    case PlayerFacing.West:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 270);
                        break;
                }

                effect.World = mCardFacing * Matrix.CreateTranslation(v) * mPlayerFacing;
                effect.View = view;
                effect.Projection = projection;
            }

            mesh.Draw();
        }
    }

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:0)

3d模型通常不包含纹理本身。 FBX文件存储每个顶点的位置,它们的连接方式以及在任何一点上纹理的哪一部分。

它不存储纹理本身。因此,您需要以与加载任何其他纹理相同的方式分别加载纹理(即使是3d模型,也需要Texture2D)。

然后,您可以将纹理分配给效果:

using

我相信这应该能够正确呈现效果。

这意味着您还可以轻松地即时交换模型的纹理,而无需更改模型本身。如果您的模型只是一个二维四边形,那么用代码生成它可能也更简单,但是您当前的设置也没错。

答案 1 :(得分:0)

可能您忘记了将嵌入式资源包含到.FBX中。请将导出设置路径模式更改为复制并启用其旁边的按钮。请参考本教程:https://www.youtube.com/watch?v=kEP34CbPWUo

编辑:

这对我不起作用,因为Monogame内容构建工具始终无法生成错误的内容:

*/Content/Wall2.fbx: error: The source file '*/Content/*0' does not exist!

然后,我只导出了没有嵌入纹理的.FBX,而是将纹理图片手动添加到Content.mgcb,并将 TextureFormat 切换为' NoChange ' enter image description here 一切都很好!

P.S。我建议将这个问题移至https://gamedev.stackexchange.com/