0

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);
    }
}
4

1 に答える 1

0

独自のIEffectFactoryクラス インスタンスをローダーに提供し、それを使用してカスタム効果を直接作成できます。

やろうとしているときにそれらを置き換えることもできます。非 const への参照の初期値を取得する理由は、左辺値でなければならないのは、partポインターをconstとして宣言したためです。つまり、ポインターを変更することはできません。

代わりに試してください:

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

ウィキを見る

于 2022-01-13T05:56:42.623 に答える