D3D11CreateDevice()返回垃圾值并失败

时间:2014-08-21 09:57:06

标签: c++ windows-8.1 directx-11

我刚开始用“ 3D游戏编程与DirectX11 ”一书研究直接3D。

我按照第一个教程获得了一个MessageBox说" D3D11CreateDevice失败"。

我检查了这个函数的返回值,得到了-2005270483的垃圾值。 0x887a002d的十六进制值,人们称之为DXGI_ERROR_SDK_COMPONENT_MISSING错误。

但是,我无法找到有关它的任何信息。此外,它不是MSDN通知D3D11CreateDevice()的可能值。

以下是创建D3D设备的书的代码:

bool D3DApp::InitDirect3D()
{
    // Create the device and device context.

    UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)  
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    D3D_FEATURE_LEVEL featureLevel;
    HRESULT hr = D3D11CreateDevice(
        0,                 // default adapter
        md3dDriverType,
        0,                 // no software device
        createDeviceFlags, // createDeviceFlags, 
        0, 0,              // default feature level array
        D3D11_SDK_VERSION,
        &md3dDevice,
        &featureLevel,
        &md3dImmediateContext);

    if( FAILED(hr) )
    {
        // I added this part to check out the return value
        TCHAR str[100];
        int code = -1;

        switch(hr) {
        case D3D11_ERROR_FILE_NOT_FOUND: code=0;
            break;
        case D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS: code=1;
            break;
        case D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS: code=2;
            break;
        case D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD: code=3;
            break;
        case DXGI_ERROR_INVALID_CALL: code=4;
            break;
        case DXGI_ERROR_WAS_STILL_DRAWING: code=5;
            break;
        case E_FAIL: code=6;
            break;
        case E_INVALIDARG: code=7;
            break;
        case E_OUTOFMEMORY: code=8;
            break;
        case E_NOTIMPL: code=9;
            break;
        case S_FALSE: code=10;
            break;
        case S_OK: code=11;
            break;
        } // switch
        _stprintf(str, L"D3D11CreateDevice Failed. Code:%ld %d", hr, code);

        MessageBox(0, str, 0, 0);
        return false;
    } // if
...

我目前正在使用DirectX版本11的Windows 8.1。 我的显卡是NVIDIA GeForce GTX 650。 我使用的编译器是VS2010 Express。

有谁知道问题和解决方案是什么?

1 个答案:

答案 0 :(得分:7)

问题是您没有为您的操作系统安装正确的DirectX Debug Runtime。 legacy DirectX SDK(2010年6月)具有适用于Windows Vista SP2的正确DirectX调试运行时和Windows 7又称DirectX 11.0,但不适用于Windows 8.0,Windows 8.1或Windows 7 SP1,KB 2670838又称DirectX 11.1或DirectX 11.2。

对于Windows 8.1,安装正确的DirectX Debug Runtime的唯一方法是安装Windows 8.1 SDK。如果您已安装Visual Studio 2013,则会自动完成此操作,或者您可以直接在系统上安装SDK。您还可以通过安装Visual Studio 2013远程调试工具包来获取Windows 8.1 SDK调试运行时。有关将调试运行时与SDK匹配的完整表格,请参阅Direct3D SDK Debug Layer Tricks

请注意,安装Windows 8.1 SDK独立并继续使用VS 2010的旧版DirectX SDK(2010年6月)以使D3D11_CREATE_DEVICE_DEBUG在Windows 8.1上再次运行就足够了,但我建议(a)升级到VS 2012或VS 2013 - 或 - (b)使用'props' solution将Windows 8.1 SDK与VS 2010集成以用于最新版本的标头。 DirectX Tool Kit为VS 2010支持提供此功能。

如果您需要继续使用D3DX11等旧版DirectX SDK以及VS 2010项目,那么您可以将Windows 8.1 SDK与DirectX SDK结合使用,但请务必列出DirectX SDK include和lib路径< em>在之后的Windows 8.1 SDK include和lib路径(参见MSDN)。

总结一下:理想的解决方案是在Windows 8.1上使用Visual Studio 2013而不使用传统的DirectX SDK。 Win32 desktop Direct3D tutorialWindows Store app Direct3D tutorial构建完全没有传统的DirectX SDK。许多DirectX SDK示例现在可在MSDN Code Gallery上使用Windows 8.x SDK构建,并且不使用旧版DirectX SDK。

您当前问题的最小解决方案是只安装Windows 8.1 SDK或Visual Studio 2013远程调试工具(x86x64)以获取正确版本的SDKDebugLayers安装对于你的操作系统,但请记住,弗兰克卢娜的书现在已经过时了。有关其他注意事项,请参阅Book Recommendations