Пользовательский эффект по умолчанию в Monogame Content Pipeline - PullRequest
0 голосов
/ 22 мая 2019

Итак, я написал свой первый шейдер HLSL для MonoGame и сумел каким-то образом подключить его к модели, которую я хочу нарисовать.Все идет нормально.Однако «каким-то образом удалось сделать это с помощью кода», на мой взгляд, некрасиво и, вероятно, не предназначен для этого:

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 я могу указать DefaultEffect для ModelProcessor, однако я не выяснил, что мне нужно делать, поэтому я могу указать свой эффект там, не вылетая из игры и не сообщая мне, что эффекты / CustomEffect не являютсядействительный эффект.

Так есть ли лучший способ достичь той же цели, что и мой существующий код?И если да, то как?

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Ваше решение является основным и наиболее гибким.

Вам необходимо переместить клон эффекта и строки параметров внутри цикла foreach и изменить его на:

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

В противном случае все части модели будут использовать одну и ту же текстуру.

Недостаток элегантности заключается в том, что это прямой перенос с платформы XNA.

Другой вариант - привести параметры и семантику в соответствие с параметрами BasicEffect, после чего сможет установить его в процессоре моделей. Процессор модели ожидает, что параметры существуют и в этом конкретном порядке.

0 голосов
/ 22 мая 2019

Похоже, что каждое effect имеет одинаковое значение, потому что оно не изменяется в цикле for.

Так что я думаю, что вы также можете определить effect в meshPart.так что вам не нужно проходить цикл for для каждого отдельного.

Вы также можете создать эффект в классе Loadcontent в game1.cs, так что вам не нужно его определятькаждый раз снова.

Я думаю, что это все, насколько я знаю.

...