如何从Blender导出fbx纹理以用于Monogame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Blender导出fbx纹理以用于Monogame相关的知识,希望对你有一定的参考价值。

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

卡片上的纹理似乎在Blender中呈现。材料设置为“无阴影”,因此它们不应受光照水平的影响吗?

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

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

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

内容全部手动加载到Visual Studio中。

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

    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();
        }
    }

有任何想法吗?谢谢。

答案

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

它不存储纹理本身。因此,您需要以加载任何其他纹理的方式单独加载纹理(您需要Texture2D,即使这是一个3d模型)。

然后,您可以将纹理指定给效果:

effect.Texture = cardTexture;

我相信这应该正确地渲染效果。

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

以上是关于如何从Blender导出fbx纹理以用于Monogame的主要内容,如果未能解决你的问题,请参考以下文章

将 .FBX 从 Blender 导入 Unity 时出现深色纹理

从 Blender 对象看不到 UDK 中的纹理

Blender导出.fbx模型到Unity贴图丢失

如何使用纹理将 fbx 转换为 usdz

从 Blender 导出多个 .fbx 文件

LibGDX fbx 导出不显示图像纹理 - 显示为黑色