【问题标题】:Monogame and .fx files?Monogame 和 .fx 文件?
【发布时间】:2014-05-19 08:50:02
【问题描述】:

我目前正在学习本教程,但使用的是 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为什么没有明确的教程被广泛使用?

【问题讨论】:

    标签: mono monogame


    【解决方案1】:

    您需要使用 2MGFX 工具将着色器 .fx 转换为适合单人游戏的文件格式。您可以在安装的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 时遇到问题,请离开 cmets。

    【讨论】:

    • 我目前正在使用 Linux。我试图重新编译工具“2MGFX”,但遗憾的是它似乎没有用...任何使用 Linux 的解决方法?
    • 不幸的是,我没有使用 linux 的经验。 :(
    • 用你的答案解决了这个问题(谢谢!)我现在已将转换添加为 VS 中的预构建事件。另请注意,mgfxo 文件需要将其 Build Action 设置为 EmbeddedResource
    【解决方案2】:

    我自己也一直在尝试遵循 Riemers 教程,和你一样,我在效果方面很挣扎。

    在成功编译和使用它之前,我必须对原始效果文件进行一些更改,没有任何例外。

    重命名如下:

    • vs_2_0 到 vs_4_0
    • ps_2_0 到 ps_4_0
    • 位置到 SV_POSITION

    完成这些更改后,我使用如下编译工具:

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

    编译后,我将 mgfxo 文件移动到我的内容文件夹中并分配了以下参数:

    • 构建操作:嵌入式资源
    • 复制到输出目录:始终复制

    我尝试了几次,直到我成功地使用了着色器,而 MonoGame 没有向我抛出任何异常。

    byte[] bytes = File.ReadAllBytes("Content/effects.mgfxo");
    effect = new Effect(GraphicsDevice, bytes);
    

    【讨论】:

      【解决方案3】:

      使用 2MGFX 工具是可选的,您可以使用该工具或内容管道,我个人更喜欢内容管道,因为它会在我每次(重新)构建内容项目时自动处理着色器文件。

      如何做到这一点?

      1. 首先:添加一个 MonoGame Content 项目,
      2. 然后在这个项目中添加.FX文件
      3. 将内容处理器设置为:属性中的“MonoGame 效果内容处理器”
      4. 然后,在您的游戏项目中添加一个引用到这个 Content 项目。

      然后像这样使用着色器:

      var myEffect = Content.Load<Effect>("shaderFileNameWithoutExtension"); 
      

      或者如果您的内容项目中有文件夹:

      var myEffect = Content.Load<Effect>("FolderName\\shaderFileNameWithoutExtension");
      

      【讨论】:

        【解决方案4】:

        我看到您正在使用 Linux。在 Linux 上编译着色器有点困难。在我自己的项目中,我发现以下资源特别有用。

        http://www.infinitespace-studios.co.uk/general/monogame-building-fx-shaders-on-a-mac-and-linux/

        在此之后,您可以像往常一样使用 MonoGame 管道构建着色器(前提是您已添加管道引用)。

        希望这会有所帮助!

        【讨论】:

        • 请尽可能描述示例。链接答案通常不被接受,除非重新输入整个页面是该想法得到传达的唯一方式。如果有具体的事情需要做,请写在你的答案中,而不是链接中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        相关资源
        最近更新 更多