首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNA 4.0和Effect代码

XNA 4.0和Effect代码
EN

Stack Overflow用户
提问于 2013-02-03 13:10:43
回答 1查看 1.7K关注 0票数 2

我正在使用XNA4.0库(而不是使用游戏类和ContentManager)开发一个游戏,因为我知道XNA4.0在运行时不支持编译效果。我试着用fxc编译器编译.fx文件,并像下面的代码一样加载效果构造函数

代码语言:javascript
复制
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,没有任何解释。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-03 22:45:03

fxc的输出与XNA中的效果编译器的输出略有不同。我不记得确切的细节了--但我相信文件头有些不同--我想是关于枚举效果参数的。

那么,解决方案就是使用XNA的内容管道附带的effect编译器,而不是fxc。您需要的类是Microsoft.Xna.Framework.Content.Pipeline.Processors.EffectProcessor

下面是一个如何使用它的示例。您可以将其放入一个简单的命令行项目中:

代码语言:javascript
复制
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派生的上下文类。有很多方法需要重写,但只需要三个方法就可以让上面的代码正常工作:

代码语言:javascript
复制
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也是如此)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14669686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档