Итак, я написал свой первый шейдер 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 не являютсядействительный эффект.
Так есть ли лучший способ достичь той же цели, что и мой существующий код?И если да, то как?