から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
。オーバーライドする必要のあるメソッドはたくさんありますが、上記のコードが機能するために実際に何かを行うために必要なのは3つだけです。
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も再配布可能かどうかはわかりません)。