【问题标题】:Custom Default Effect in Monogame Content PipelineMonogame 内容管道中的自定义默认效果
【发布时间】:2019-05-23 05:44:52
【问题描述】:

所以我最终为 MonoGame 编写了我的第一个 HLSL 着色器,并设法以某种方式将它连接到我想要绘制的模型。 到目前为止,一切都很好。 然而,在我看来,“不知何故设法做到这一点”是丑陋的,可能不是实现这一目标的预期方式:

internal Model(ContentManager content)
{
    mModel = content.Load<Microsoft.Xna.Framework.Graphics.Model>("models/CustomModel");
    // individual effect for individual models
    var effect = content.Load<Effect>("effects/CustomEffect").Clone();
    effect.Parameters["Texture"].SetValue(mModel.Meshes[0].MeshParts[0].Effect.Parameters["Texture"].GetValueTexture2D());

    foreach (var mesh in mModel.Meshes)
    {
        foreach (var meshPart in mesh.MeshParts)
        {
            meshPart.Effect = effect;
        }
    }
}

如您所见,我分别加载了我的模型和效果,并用我新加载的自定义效果替换了模型的所有基本效果。并保留旧的 TextureVariable。

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

那么有没有更好的方法来实现与现有代码相同的目标?如果有,怎么做?

【问题讨论】:

    标签: xna monogame


    【解决方案1】:

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

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

    var effect = content.Load<Effect>("effects/CustomEffect").Clone();
    effect.Parameters["Texture"].SetValue(meshPart.Effect.Parameters["Texture"].GetValueTexture2D());
    

    否则模型的所有部分都将使用相同的纹理。

    缺乏优雅之处在于这是直接继承自XNA 平台。

    另一个选项是让您的参数和语义与BasicEffect 的匹配,此时您应该能够在模型处理器中设置它。模型处理器期望参数以特定顺序存在。

    【讨论】:

    • 为了让它与模型处理器一起工作:我是否需要创建一个额外的包装类或其他东西,或者添加统一变量是否足够?
    • 不需要额外的课程。确保你的统一变量和语义与BasicEffect 一致就足够了。我从来没有尝试过。从代码库来看,这应该可以工作。
    • 我是只提供内容文件夹内的路径,还是只提供基本名称,而不提供扩展名?
    • 很好的问题,我目前无法给出明确的答案(我必须在几分钟后离开进行约会),如果我冒险猜测,完整的内容路径,因为编译顺序需要它。
    【解决方案2】:

    看起来每个 effect 都有相同的值,因为它在 for 循环中不会改变。

    所以我认为您也可以在meshPart 中定义effect。所以你不必为每个单独的循环遍历。

    你也可以在game1.cs的Loadcontent类中创建效果,这样就不用每次都重新定义了。

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

    【讨论】:

    • 您能否澄清一下“在meshPart 中定义效果”是什么意思?另外,我在哪里创建效果也没关系
    • 这是假设meshPart 是一个自定义类,您可以在其中创建其他变量。但回头看,我不确定它是否真的有助于提高性能。也许由于这个问题没有指定问题,那么这个问题也可以(如果不是更好)在代码审查中提出:codereview.stackexchange.com
    • meshPart 是一个内置类,其中包含三角形的顶点列表和用于渲染它们的效果。如果没有.Clone(),所有效果都将共享uniform 参数,如纹理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多