如何将 DirectX::Model 与自定义 DirectX::Effect 一起使用

How to use DirectX::Model with a custom DirectX::Effect

我正在使用 DirectXToolKit。我创建了一个这样的模型

m_Model = Model::CreateFromCMO(device, L"Content/Meshes/cube.cmo", *m_EffectFactory);

我想使用我创建的继承自 DirectX::IEffect 的自定义效果。

    m_ModelEffect = std::make_shared<UnlitEffect>(device);

但是,DirectX::Model 默认情况下会创建自己的效果,这意味着为了使用我自己的着色器,我必须使用

替换它们
MeshPart::ModifyEffect(ID3D11Device* d3dDevice, std::shared_ptr<IEffect>& ieffect, bool isalpha);

我对如何将我的效果发送到该函数感到困惑。

这是我现在使用的代码:

for(const auto& mesh : m_Model->meshes)
{
    for(const auto& part : mesh->meshParts)
    {
        part->ModifyEffect(device, &m_ModelEffect);
    }
}

然而这会导致这个错误 initial value of reference to non-const must be an lvalue 搜索该错误为我提供了许多解决方案,这些解决方案涉及更改函数签名以使用 const 引用,但是我到底应该如何在不更改它的情况下按原样使用该函数?传递 shared_ptr 地址的正确方法是什么?

编辑: 我使用这段代码让它工作

m_ModelEffect = std::make_shared<UnlitEffect>(device);

m_Model = Model::CreateFromCMO(device, L"Content/Meshes/cube.cmo", *m_EffectFactory);
for(auto& mesh : m_Model->meshes)
{
    for(auto& part : mesh->meshParts)
    {
        part->ModifyEffect(device, m_ModelEffect);
    }
}

您可以向加载程序提供您自己的 IEffectFactory class 实例,并使用它直接创建您的自定义效果。

您也可以根据需要替换它们。您得到 initial value of reference to non-const must be an lvalue 的原因是因为您将 part 指针声明为 const 表示不可修改。

改为尝试:

for(auto& mesh : m_Model->meshes)
{
    for(auto& part : mesh->meshParts)
    {
        part->ModifyEffect(device, &m_ModelEffect);
    }
}
m_Model->Modified();

the wiki