2

我正在使用 XNA 4.0 库(不使用游戏类和 ContentManager)开发游戏据我所知,XNA 4.0 不支持运行时编译效果。我尝试使用 fxc 编译器编译 .fx 文件并像这段代码一样加载到 Effect 构造函数

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

此时我收到异常错误消息“您只能使用已编译的数据构造 Effect。此数据不是已编译的效果。”

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

谢谢

4

1 回答 1

4

的输出与fxcXNA 中效果编译器的输出略有不同。我不记得确切的细节 - 但我认为文件头存在差异 - 我认为关于枚举效果参数的一些事情。

因此,解决方案是使用 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 是否也是如此)。

于 2013-02-03T14:45:02.613 回答