2013-02-03 74 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'的輸出將起作用。 –