從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'的輸出將起作用。 –