Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xna 单游戏内容管道中的自定义默认效果_Xna_Monogame - Fatal编程技术网

Xna 单游戏内容管道中的自定义默认效果

Xna 单游戏内容管道中的自定义默认效果,xna,monogame,Xna,Monogame,所以我最终为MonoGame编写了我的第一个HLSL着色器,并设法以某种方式将其连接到我想要绘制的模型。 到现在为止,一直都还不错。 然而,在我看来,“以某种方式设法做到这一点的代码”是丑陋的,并且可能不是实现这一点的预期方式: 内部模型(ContentManager内容) { mModel=content.Load(“models/CustomModel”); //个别模型的个别效应 var effect=content.Load(“effects/CustomEffect”).Clone()

所以我最终为MonoGame编写了我的第一个HLSL着色器,并设法以某种方式将其连接到我想要绘制的模型。 到现在为止,一直都还不错。 然而,在我看来,“以某种方式设法做到这一点的代码”是丑陋的,并且可能不是实现这一点的预期方式:

内部模型(ContentManager内容)
{
mModel=content.Load(“models/CustomModel”);
//个别模型的个别效应
var effect=content.Load(“effects/CustomEffect”).Clone();
effect.Parameters[“Texture”].SetValue(mModel.mesh[0].MeshParts[0].effect.Parameters[“Texture”].GetValueTexture2D());
foreach(mModel.mesh中的变量网格)
{
foreach(网格中的var meshPart.MeshParts)
{
效应=效应;
}
}
}
如您所见,我分别加载了模型和效果,并用新加载的自定义效果替换了模型的所有基本效果。并保持旧的纹理可变

就我自己而言,我相信有一个更优雅的解决方案,这个解决方案包括告诉MonoGame使用CustomEffect而不是BasicFect。 我知道使用MGCB工具,我可以为ModelProcessor指定DefaultEffect,但是我还没有找到我需要做什么,这样我就可以在那里指定我的效果,而不会让游戏崩溃,并告诉我effects/CustomEffect不是有效的效果


那么,有没有更好的方法来实现我现有代码的目标呢?如果是这样的话,每个
效果都有相同的值,因为它在for循环中没有变化

因此,我认为您也可以在
meshPart
中定义
效果。因此,您不必为每个单独的循环遍历for循环

您还可以在game1.cs中的
Loadcontent
类中创建效果,这样您就不必每次都定义它


据我所知,我想就是这样。

您的解决方案是最主要的,也是最灵活的

您确实需要在foreach循环中移动效果克隆和参数行,并将其更改为:

var effect = content.Load<Effect>("effects/CustomEffect").Clone();
effect.Parameters["Texture"].SetValue(meshPart.Effect.Parameters["Texture"].GetValueTexture2D());
var effect=content.Load(“effects/CustomEffect”).Clone();
effect.Parameters[“Texture”].SetValue(meshPart.effect.Parameters[“Texture”].GetValueTexture2D());
否则,模型的所有部分将使用相同的纹理

缺乏优雅之处在于,这是XNA平台直接遗留下来的


另一个选项是使您的参数和语义与
basicefect
的参数和语义匹配,此时您应该能够在模型处理器中设置它。模型处理者希望参数存在,并按特定顺序排列。

您能否澄清“在网格零件中定义效果”的含义?另外,我在何处创建effects并不重要,这是假设
meshPart
是一个自定义类,您可以在其中创建其他变量。但回顾过去,我不确定它是否真的有助于提高性能。也许因为这个问题没有指定问题,那么这个问题(如果不是更好的话)也可以在代码审查时提出:meshPart是一个内置类,它包含三角形的顶点列表以及用于渲染三角形的效果。如果没有
.Clone()
,所有效果都将共享
统一的
参数,如纹理。要使其与模型处理器协同工作,我是否需要创建额外的包装类或其他内容,或者向效果添加统一的变量是否足够?不需要额外的类。确保您的统一变量和语义与
basicefect
保持一致,这就足够了。我从来没有试过。从代码库来看,这应该是可行的。我只是在内容文件夹中提供路径,还是只提供没有扩展名的basename?好问题,我现在无法给出一个明确的答案(我必须在几分钟后离开约会),如果我要冒险猜测,完整的内容路径,因为编译的顺序需要它。