我目前正在学习本教程,但使用的是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教程,它被广泛使用?
答案 0 :(得分:2)
您需要使用2MGFX工具将着色器.fx转换为适合monogame的文件格式。您可以在已安装的monogame目录C:\Program Files (x86)\MSBuild\MonoGame\v3.0
使用方法:
2MGFX.exe effects.fx effects.mgfxo
pause
请注意,着色器文件,.bat文件和2MGFX.exe必须位于同一目录中。
以下是如何使用已编译的.mgfxo文件作为效果:
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时遇到问题,请发表评论。
答案 1 :(得分:2)
我一直在尝试自己跟踪Riemers教程,就像你一样,我努力学习这些效果。
在成功设法编译并使用它之前,我必须对原始效果文件进行一些更改,没有任何例外。
重命名以下内容:
完成这些更改后,我使用了以下编译工具:
2MGFX.exe effects.fx effects.mgfxo / Profile:DirectX_11
编译完成后,我将mgfxo文件移动到我的内容文件夹中并分配了以下参数:
我花了几次尝试,直到我设法使用没有MonoGame的着色器向我抛出任何异常。
byte[] bytes = File.ReadAllBytes("Content/effects.mgfxo");
effect = new Effect(GraphicsDevice, bytes);
答案 2 :(得分:1)
使用2MGFX工具是可选的,你可以使用工具或内容管道,我个人更喜欢Content管道,因为每次我(重新)构建Content项目时它都会自动处理着色器文件。
怎么做?
并像这样使用着色器:
var myEffect = Content.Load<Effect>("shaderFileNameWithoutExtension");
或者如果您的内容项目中有文件夹:
var myEffect = Content.Load<Effect>("FolderName\\shaderFileNameWithoutExtension");
答案 3 :(得分:1)
我看到您正在使用Linux。在Linux上编译着色器有些困难。在我自己的项目中,我发现以下资源特别有用。
http://www.infinitespace-studios.co.uk/general/monogame-building-fx-shaders-on-a-mac-and-linux/
在此之后,您可以正常使用MonoGame管道构建着色器(前提是您已添加管道参考)。
希望这会有所帮助!