2016-05-29 5 views
1

デモでEffectフレームワークを使用しています。ここID3DX11Effectポインタを解放できませんか?

は、私がそこにある、私はデモのウィンドウを閉じると、デモを実行して、私は

void HillsDemo::UnLoadContent() 
{ 
    if (m_pVertexBuffer) m_pVertexBuffer->Release(); 
    if (m_pIndexBuffer) m_pIndexBuffer->Release(); 
    if (m_pInputLayout) m_pInputLayout->Release(); 
    if (m_pTechnique) m_pTechnique->Release(); 
    if (m_pFx) m_pFx->Release(); 
} 

error picture

に従うようにそれらを解放

ID3D11Buffer*     m_pVertexBuffer; 
    ID3D11Buffer*     m_pIndexBuffer; 
    ID3D11InputLayout*    m_pInputLayout; 

    ID3DX11Effect*     m_pFx; 
    ID3DX11EffectTechnique*   m_pTechnique; 
    ID3DX11EffectMatrixVariable* m_pFxWorldViewProj; 

ヘッダファイルに私のdefinationありますなぜでしょうか?次に、 if (m_pFx) m_pFx->Release();という行を削除しても、エラーはありません。だから m_pFxをリリースしますか?

私はEffect11 https://github.com/Microsoft/FX11/wiki/Effects-11のドキュメントを表示、文書にあります。

次のタイプは、現在のIUnknownから派生している:ID3DX11EffectType、ID3DX11EffectVariable、I3DX11EffectPass、ID3DX11EffectTechnique、ID3DX11EffectGroup。これらのオブジェクトは、標準のCOM参照カウントルールに従わず、親ID3DX11Effectが解放されると解放されます。これは主に、管理対象言語からのEffects 11の使用を簡素化することです。

m_pFxm_pTechniqueの両方をリリースするのではなく、m_pFxをリリースする必要があるということですか?何か案は?

答えて

2

プロジェクトwikiへの参照に基づいて、従来のDirectX SDKのコピーではなく、GitHubの最新バージョンのEffects 11を使用しているとします。

実際には、COMオブジェクトへの生ポインタの代わりにComPtrを使用します。 Effects 11の場合は、ID3DX11Effectインスタンスに対してのみ使用します。 ID3DX11EffectTypeID3DX11EffectVariableI3DX11EffectPassID3DX11EffectTechnique、およびID3DX11EffectGroupの「生ポインタ」を使用してください。 ID3DX11Effectによって制御される寿命として、これらの生ポインタでReleaseを呼び出すのは気にしないでください。以下のような

何か:

Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVertexBuffer; 
Microsoft::WRL::ComPtr<ID3D11Buffer> m_pIndexBuffer; 
Microsoft::WRL::ComPtr<ID3D11InputLayout> m_pInputLayout; 

Microsoft::WRL::ComPtr<ID3DX11Effect> m_pFx; 
ID3DX11EffectTechnique* m_pTechnique; 
ID3DX11EffectMatrixVariable* m_pFxWorldViewProj; 

void HillsDemo::UnLoadContent() 
{ 
    m_pVertexBuffer.Reset(); 
    m_pIndexBuffer.Reset(); 
    m_pInputLayout.Reset(); 
    m_pFx.Reset(); 
    m_pTechnique = nullptr; 
    pFxWorldViewProj = nullptr; 
} 
+0

は、私がComPtrを使用する場合はエラーがなかった、ありがとうございました。しかし、私が未加工のポインタを使用する場合、問題はまだ私がm_pFxをリリースする限り解決されていません。それはとても混乱しています。 – zhangbaochong

+0

'' m_pFx''の作成方法を表示する必要があります –

+0

次のように、 'D3DX11CompileEffectFromFile'関数を使用します:L = color.fx、nullptr、D3D_COMPILE_STANDARD_FILE_INCLUDE、shaderFlags、0、m_pd3dDevice、&m_pFx 、&​​errorBlob); 、違いますか? – zhangbaochong

関連する問題