2013-02-03 45 views
2

我正在开发使用XNA 4.0库(不使用游戏类和ContentManager)的游戏 正如我所知,XNA 4.0在运行时不支持编译效果。 我试图编译的.fx文件,FXC编译器和负载效应构造这样的代码XNA 4.0和效果代码

FileStream f = new FileStream(FName, FileMode.Open); 
byte[] fData = new byte[f.Length]; 
f.Read(fData, 0, FData.Length); 
f.Close(); 
Effect ef = new Effect(GfxDev, fData); 

我在这一点上 “你只能构建数据效果已经编制。该数据有异常错误信息不是编译后的效果。“

什么我需要使用效果构造函数的代码? 我查了MSDN并没有解释。

由于

回答

4

fxc的输出是在XNA效果编译器的输出微妙的不同。我不记得确切的细节 - 但我相信文件头中有不同 - 有关枚举效果参数,我想。

然后,解决方案是使用XNA内容管道附带的效果编译器代替fxc。你需要的课程是Microsoft.Xna.Framework.Content.Pipeline.Processors.EffectProcessor

这是一个如何使用它的例子。你可以把它变成简单的命令行项目:

string fx = File.ReadAllText("Effect1.fx"); 

EffectProcessor effectProcessor = new EffectProcessor(); 
var effect = effectProcessor.Process(new EffectContent { EffectCode = fx }, new MyContext()); 

byte[] yourEffectCode = effect.GetEffectCode(); 

请注意,您需要一个上下文类,从ContentProcessorContext的。有很多你需要重写方法,但只需要三个实际做任何事情上面的代码工作:

class MyContext : ContentProcessorContext 
{ 
    public override string BuildConfiguration { get { return ""; } } 
    public override TargetPlatform TargetPlatform { get { return TargetPlatform.Windows; } } 
    public override GraphicsProfile TargetProfile { get { return GraphicsProfile.HiDef; } } 
    // ... other overrides ... 
} 

注意(以及Microsoft.Xna.Framework.Graphics.dll),这要求你的项目引用Microsoft.Xna.Framework.Content.Pipeline.dll。这要求您的项目是针对完整的.NET 4.0框架(而不是“客户端配置文件”)构建的。此内容管道DLL是而不是可再分发(但我不确定fxc是否)。

+0

因此无论如何我需要将这些内容管道类导入并实现到我的项目中。 当我移植到Xbox 360或Windows Phone时它还在工作吗? 谢谢 –

+0

管道DLL本身不适用于这些平台。但是如果您将'TargetPlatform'设置为正确的值,则'EffectProcessor'的输出将起作用。 –