Monogame和.fx文件?

3

我目前在使用MonoGame跟随这个教程:
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_from_file.php
如教程所述,我的主要目标是从图像文件中渲染出一个地形。

教程提供了一个.fx文件,我已经将其包含在我的项目中。

我在使用MonoGame加载bmp文件时遇到了一些问题,现在我已经解决了它。问题现在来自于fx文件。MonoDevelop提示: The MGX File is Corrupt !

以下是作者原始代码:
effect = Content.Load<Effect> ("effects");

以下是我在MonoGame中的使用方式:
effect = Content.Load<Effect> ("effects.fx");

我对在MonoGame中使用效果文件感到非常困惑。是否有任何好的教程可以参考?无论如何,我对MonoGame感到非常迷茫。为什么没有清晰的MonoGame教程,因为它被广泛使用?

4个回答

2
我一直在尝试跟随Riemers教程(链接),像你一样,我也遇到了困难。
在成功编译和使用效果文件之前,我不得不对原始效果文件进行了一些更改。
重命名以下内容:
  • vs_2_0 改为 vs_4_0
  • ps_2_0 改为 ps_4_0
  • POSITION 改为 SV_POSITION
这些更改完成后,我使用如下的编译工具:

2MGFX.exe effects.fx effects.mgfxo /Profile:DirectX_11

编译完成后,我将mgfxo文件移动到我的内容文件夹中,并分配以下参数:
  • Build action: Embedded resource
  • Copy to output directory: Copy always
经过几次尝试,我最终成功使用了着色器,而且没有出现任何异常。
byte[] bytes = File.ReadAllBytes("Content/effects.mgfxo");
effect = new Effect(GraphicsDevice, bytes);

2
您需要使用2MGFX工具将您的着色器.fx转换为适当的文件格式,以便于在Monogame中使用。您可以在已安装的Monogame目录C:\Program Files (x86)\MSBuild\MonoGame\v3.0中找到该工具。
使用方法如下:
  1. 创建一个.bat文件,并编写以下代码:
  2. 2MGFX.exe effects.fx effects.mgfxo pause
  3. 执行.bat文件
请注意,着色器文件、.bat文件和2MGFX.exe必须在同一目录中。
以下是如何将编译后的.mgfxo文件用作效果的方法:
  1. 将effects.mgfxo文件放入项目的Assets\Content文件夹中
  2. 按照以下方式加载文件
Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("ProjectNameSpace.Assets.Content.effects.mgfxo");
BinaryReader Reader = new BinaryReader(s);
Effect effect = new Effect(graphics, Reader.ReadBytes((int)Reader.BaseStream.Length)); 

如果您在将着色器 .fx 文件转换为 .mgfxo 文件时遇到问题,请留下评论。

我目前正在使用Linux。我尝试重新编译工具“2MGFX”,但遗憾的是似乎没有成功...有没有在Linux上的任何解决方法? - Depado
很遗憾,我没有Linux的经验。 :( - Wallstrider
1
在得到您的答案后(谢谢!),我现在已将转换作为 VS 中的预构建事件添加。还请注意,mgfxo 文件需要将其“生成操作”设置为“嵌入式资源”。 - Mark Pattison

1
使用2MGFX工具是可选的,您可以使用该工具或内容管道,个人而言,我更喜欢内容管道,因为每次构建内容项目时它都会自动处理着色器文件。
如何操作?
1.首先:添加一个MonoGame内容项目, 2.然后在此项目中添加.FX文件 3.在属性中将内容处理器设置为:"MonoGame效果内容处理器" 4.然后,在游戏项目中添加引用到此内容项目。
最后,像这样使用着色器:
var myEffect = Content.Load<Effect>("shaderFileNameWithoutExtension"); 

或者如果您在内容项目中有文件夹:
var myEffect = Content.Load<Effect>("FolderName\\shaderFileNameWithoutExtension");

1

如果可能的话,请描述示例。通常不接受链接答案,除非重新输入整个页面是传达想法的唯一方法。如果有特定的事情需要完成,请在您的答案中写下它,而不是链接。 - Vendetta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接