2

XNA 4.0ライブラリを使用してゲームを開発しています(ゲームクラスとContentManagerを使用していません)。私が知っているように、XNA4.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は既にコンパイルされたデータでのみ構築できます。このデータはコンパイルされたEffectではありません。」

Effectコンストラクターに使用する必要のあるコードは何ですか?私はMSDNをチェックしましたが、説明はありません。

ありがとう

4

1 に答える 1

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

于 2013-02-03T14:45:02.613 に答える