c++ - D3D11CreateDevice() 返回垃圾值并失败

标签 c++ windows-8.1 directx-11

我刚刚开始学习直接 3d,这本书是 3D Game Programming with DirectX11

我遵循了第一个教程并得到了一个消息框,上面写着“D3D11CreateDevice Failed”。

我检查了这个函数的返回值,得到了-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。

有谁知道问题所在和解决方案吗?

最佳答案

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

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

请注意,单独安装 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 集成以获得最新版本的 header 。 DirectX Tool Kit这样做是为了支持 VS 2010。

如果您需要继续使用仅旧的 DirectX SDK 组件,如 D3DX11 以及您的 VS 2010 项目,那么您可以将 Windows 8.1 SDK 与 DirectX SDK 结合使用,但一定要列出 DirectX SDK 包含和库路径 < em>在 Windows 8.1 SDK 包含和 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,但请记住,Frank Luna 的书现在已经过时了。参见 Book Recommendations一些额外的注释。

关于c++ - D3D11CreateDevice() 返回垃圾值并失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423371/

相关文章:

c++ - DirectX 11。你好三角形不渲染

c++ - 向 Texture2D 复制和从 Texture2D 复制的最快方式

c++ - 我可以从两个 oci 客户端维护一个 Oracle session 吗?

c++ - 如何在 C++ 中制作 Qt GUI 应用程序而不会发生内存泄漏

c++ - 使用 CUDA 的 Thrust 库进行数组缩减

c# - 如何在弹出对话框打开时禁用后台 GUI 交互

MySQL 表消失

c++ - 将多个迭代器推进到同一字符串流

windows-phone-8 - 我可以在 Windows 8.1 通用应用和 Windows 10 通用 Windows 应用之间共享代码吗

directx - 在 DirectX 11 中跨适配器传输纹理