XNA 4.0,FBX和纹理加载失败

我已经经历了几个关于如何使用XNA的教程,并且理解了很多。 我有一个屏幕,我有2D精灵工作,得到一个着色系统运作,迄今为止好。 现在我撞墙了。

我试图加载从3DS导出的3D模型(FBX格式)。 我的问题是纹理系统。 首先,我试图避免将纹理直接embedded到FBX中,因为我将重复使用大量纹理来处理不同的事情,不需要加载同一纹理的多个副本。 我知道我的纹理,即使没有embedded,它正在使我的XNA类,因为我可以看到它在FBX内(当保存为ASCII),并得到一个编译器错误,如果我试图将纹理移出原来的位置。 我也可以看到它在重建期间编译图像。

但是,如果我尝试渲染对象,则无纹理。 加载代码:

protected override void LoadContent() { objModel = LoadModel("Models/OriginModel"); } 

objModel被定义为cs文件中较高的一个模型

我的显示代码:

 foreach (ModelMesh mesh in objModel.Meshes) { foreach (Effect currentEffect in mesh.Effects) { currentEffect.CurrentTechnique = currentEffect.Techniques["TextureNormalMap"]; currentEffect.Parameters["World"].SetValue(objTransforms[mesh.ParentBone.Index] * worldMatrix); currentEffect.Parameters["View"].SetValue(viewMatrix); currentEffect.Parameters["Projection"].SetValue(projectionMatrix); } } 

我已经删除了matrix变换,如他们不是造成这个问题。 TextureNormalMap是我写的着色器,用普通贴图显示纹理。 这会产生一个黑色模型。 如果我加上…

 metalTex = Content.Load<Texture2D>("Textures/brushedmetaltexture"); 

 currentEffect.Parameters["ColorMap"].SetValue(metalTex); 

在需要的地方,我得到纹理显示。 这当然是问题所在。 我必须在我的内容系统中包含纹理,导致图像被编译两次(从FBX产生一个警告。编译一次,从内容编译一次)。 更重要的是,我将不得不在XNA系统中手动纹理所有的模型,以便让它们显示,这正是我想要避免的。 我已经在3DS中纹理过一次,我真的需要在对象加载过程中指定所有的纹理吗?

那么,我在这里做错了什么想法? 我跳过了什么神奇的步骤? 我是否应该弄清楚FBX文件本身的纹理名称是什么,并获取一个指向提取的图像的指针,以便将其input到我的Texture2D中? 是否还有一个不同的对象,包括FBX的纹理? 我需要咬紧牙关,只需要embedded(这仍然不能用上面的代码btw)?

正如我刚才提到的那样,我已经离开了教程,但是这一步似乎已经不存在了,或者我只是呆呆的? 我很抱歉,如果这似乎微不足道,但我不能解决它。 在我缺less的对象加载过程中是否有一些步骤?

我认为FBX文件中纹理的名称是分配给效果参数的。 所以如果没有设置为“ColorMap”,它将不起作用。

我个人使用自定义内容处理器,允许我在Visual Studio属性窗口中更改纹理,效果文件和其他任何权利。 检查这个function ,看看我如何设置纹理。 “DiffuseTexture”是我的效果参数的名称。

如果你在代码中徘徊,还有很多其他支持我的拼凑在一起的Blender-> FBX-> XNA管道。 它甚至支持从一个FBX文件导入多个animation。 我不推荐给任何人,但是如果你已经犯了这个错误,那可能是有用的。