从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是否)。
因此无论如何我需要将这些内容管道类导入并实现到我的项目中。 当我移植到Xbox 360或Windows Phone时它还在工作吗? 谢谢 –
管道DLL本身不适用于这些平台。但是如果您将'TargetPlatform'设置为正确的值,则'EffectProcessor'的输出将起作用。 –