2015-06-01 28 views
0

我在讀這本書介紹由Frank Luna編寫的DirectX 11編程,我遇到了Effects11的問題。D3D11 D3DX11CreateEffectFromMemory返回E_NOITERFACE

void BoxApp::BuildFX() 
{ 

    DWORD shaderFlags = 0; 
#if defined(DEBUG) || defined(_DEBUG) 
    shaderFlags |= D3D10_SHADER_DEBUG; 
    shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION; 
#endif 

    ID3D10Blob* compiledShader = 0; 
    ID3D10Blob* compilationMsgs = 0; 
    HRESULT hr = D3DX11CompileFromFile(L"FX/color.fx", 0, 0, 0, "fx_5_0", shaderFlags, 
     0, 0, &compiledShader, &compilationMsgs, 0); 

    // compilationMsgs can store errors or warnings. 
    if(compilationMsgs != 0) 
    { 
     MessageBoxA(0, (char*)compilationMsgs->GetBufferPointer(), 0, 0); 
     ReleaseCOM(compilationMsgs); 
    } 

    // Even if there are no compilationMsgs, check to make sure there were no other errors. 
    if(FAILED(hr)) 
    { 
     DXTrace(__FILE__, (DWORD)__LINE__, hr, L"D3DX11CompileFromFile", true); 
    } 

    HR(D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), 
     0, md3dDevice, &mFX)); 

    // Done with compiled shader. 
    ReleaseCOM(compiledShader); 

    mTech = mFX->GetTechniqueByName("ColorTech"); 
    mfxWorldViewProj = mFX->GetVariableByName("gWorldViewProj")->AsMatrix(); 
} 

我正在使用此代碼來加載我的效果文件。問題是我在D3DX11CreateEffectFromMemory處收到E_NOINTERFACE錯誤。有趣的部分是運行本書中的示例成功調用函數,並且使用相同的靜態庫(d3dx11effect.h和Effect11d.lib)。我試着編譯效果,然後加載它,但問題仍然存在。

感謝您的幫助。

我發現這個人(E_NOINTERFACE result from D3DX11CreateEffectFromMemory)有完全相同的問題,他通過降級到VS2010解決了這個問題。我會很高興與任何其他解決方案。

回答

2

針對您的特定問題,問題是您正在嘗試使用VS 2010構建的靜態C++庫以及更新版本的Visual C++工具集,這可能會導致問題。解決方案是使用當前工具集從源代碼構建效果庫。

Direct3D 11效果庫的最新和完整源代碼可在CodePlex & GitHub上找到。如果您使用的是VS 2013,則還可以從NuGet獲得Windows桌面應用程序的副本。

不幸的是,弗蘭克的書是寫,只是在開發人員如何獲得最新的頭文件,庫,工具和支持DirectX樣品的重大轉變和遺留的DirectX SDK的棄用之前出版。有關詳細信息,請參閱MSDNblog post。我已經對弗蘭克的書籍here做了一些具體的說明。

您還沒有明確提到它,但我假設您使用的是包含Windows 8.x SDK的VS 2012或VS 2013。您可以使用此工具集的舊版DirectX SDK進行一些項目文件調整,但您應該記住,不推薦使用D3DX9,D3DX10和D3DX11的所有版本。請參閱Living without D3DX以取代Direct3D 11.

另請參閱DirectX SDKs of a certain ageDirectX SDK Samples CatalogDirectX SDK Tools Catalog。從DXSDK樣品

+0

我照你說的做了,似乎現在工作。非常感謝您幫助我解決這個問題並提供所有這些帖子。一旦我對DX有了更多的瞭解,我會嘗試擺脫D3DX。再次感謝。 – wajsic

0

編譯的源代碼VS2010

C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Samples\C++\Effects11\Effects11_2008.sln

副本D3DX11EffectsD.lib到庫的路徑,並將其鏈接。

1

項目屬性 - >配置屬性 - >常規 - >平臺工具集 - >更改 「的Visual Studio 2013(V120)」 到 「的Visual Studio 2013 - 視窗XP(v120_xp)」

希望這會有所幫助。

+1

@BhargavRao哦,我只想分享我的方式來解決它。但我無法清楚解釋它爲什麼起作用。只是這個。我認爲沒有必要創建一個新問題。謝謝。 – Shadess

+1

@BhargavRao好的。 SRY – Shadess