我正在尝试使用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();
}
}
有什么想法吗?谢谢。
答案 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 ' 一切都很好!
P.S。我建议将这个问题移至https://gamedev.stackexchange.com/