XNA 4.0和效果代码

时间:2013-02-03 05:10:43

标签: c# xna shader xna-4.0 hlsl

我正在使用XNA 4.0库开发游戏(不使用游戏类和ContentManager) 据我所知,XNA 4.0在运行时不支持编译效果。 我尝试使用fxc编译器编译.fx文件并加载到效果构造函数,如此代码

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构造函数使用什么代码? 我查了MSDN,没有解释。

由于

1 个答案:

答案 0 :(得分: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是否也是如此)。