D3D11CreateDevice()返回垃圾值并失败

Pet*_*ter 2 c++ directx-11 windows-8.1

我刚开始用DirectX11的3D游戏编程学习直接3D .

我按照第一个教程得到了一个MessageBox,说"D3D11CreateDevice失败".

我检查了这个函数的返回值并获得了垃圾值-2005270483.十六进制值0x887a002d,人们说这是DXGI_ERROR_SDK_COMPONENT_MISSING错误的.

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

以下是创建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
...
Run Code Online (Sandbox Code Playgroud)

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

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

Chu*_*urn 7

问题是您没有为您的操作系统安装正确的DirectX Debug Runtime.在传统的DirectX SDK(2010年6月)有正确的DirectX调试运行时为Windows Vista SP2和Windows 7又名的DirectX 11.0,但不是一个正确的Windows 8.0,Windows 8.1中,或Windows 7 KB SP1 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调试层技巧.

请注意,安装Windows 8.1 SDK独立并继续使用VS 2010的旧版DirectX SDK(2010年6月)D3D11_CREATE_DEVICE_DEBUG再次在Windows 8.1上运行就足够了,但我建议(a)升级到VS 2012或VS 2013 - 或 - (b)使用'道具'解决方案将Windows 8.1 SDK与VS 2010集成,以获得最新版本的标题.在DirectX的工具包做这行VS 2010的支持.

如果您需要继续使用D3DX11等旧版DirectX SDK以及VS 2010项目,那么您可以将Windows 8.1 SDK与DirectX SDK结合使用,但请确保在Windows 8.1 之后列出DirectX SDK include和lib路径SDK包含和lib路径(请参阅MSDN).

总结一下:理想的解决方案是在Windows 8.1上使用Visual Studio 2013而不使用传统的DirectX SDK.在Win32的台式机的Direct3D教程或Windows应用商店的应用程序的Direct3D教程关掉了传统的DirectX SDK在所有就好了.许多DirectX SDK示例现在可在MSDN代码库中使用,该代码库使用Windows 8.x SDK构建,并且不使用旧版DirectX SDK.

最小的解决您的眼前的问题是刚刚安装的Windows 8.1 SDK或在Visual Studio 2013远程调试工具(86或64位),以获得安装操作系统的SDKDebugLayers的正确版本,但请记住,弗兰克·卢纳的书现在相当过时了.有关其他说明,请参阅书籍建议.