首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >D3D11CreateDevice()返回垃圾值并失败

D3D11CreateDevice()返回垃圾值并失败
EN

Stack Overflow用户
提问于 2014-08-21 09:57:05
回答 1查看 3.7K关注 0票数 2

我刚开始学习直接3d,用DirectX11编写3D游戏编程一书。

我学习了第一个教程,得到了一个MessageBox,上面写着"D3D11CreateDevice失败“。

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

但是,我找不到任何关于它的信息。而且,MSDN没有通知D3D11CreateDevice()的任何可能值。

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

代码语言:javascript
运行
复制
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
...

我目前正在Windows8.1与DirectX版本11工作。我的显卡是NVIDIA GeForce GTX 650。我使用的编译器是VS2010 Express。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-21 18:06:14

问题在于,您的操作系统没有安装正确的DirectX调试运行时。 legacy DirectX SDK (2010年6月)为Windows SP2和Windows7aka DirectX 11.0安装了正确的DirectX调试运行时,但对于Windows8.0、Windows8.1或带有KB 2670838又名DirectX 11.1或DirectX 11.2的Windows 7 SP1则不正确。

对于Windows8.1,安装正确的DirectX调试运行时的唯一方法是安装Windows8.1SDK。如果安装了Visual 2013,或者可以直接在系统上安装SDK,则会自动完成此操作。还可以通过安装Visual 2013远程调试工具包获得Windows8.1SDK调试运行时。有关调试运行时与SDK匹配的完整表,请参见Direct3D SDK Debug Layer Tricks

请注意,安装Windows8.1SDK独立并继续使用遗留的DirectX SDK (2010年6月)和VS 2010使D3D11_CREATE_DEVICE_DEBUG在Windows8.1上重新工作就足够了,但我建议(a)升级到VS 2012或VS 2013 -或- (b)使用'props' solution将Windows8.1SDK与VS 2010集成到最新版本的标头。DirectX Tool Kit这样做是为了支持VS 2010。

如果您需要继续只在VS 2010项目中使用遗留的DirectX SDK组件(如D3DX11 ),那么您可以将Windows8.1SDK与DirectX SDK组合起来,但是一定要列出Windows8.1SDK包含和库路径之后的DirectX SDK包含和库路径(参见MSDN)。

总结一下:理想的解决方案是只在Windows8.1上使用Visual 2013,而不使用遗留的DirectX SDK。Win32 desktop Direct3D tutorialWindows Store app Direct3D tutorial在没有遗留DirectX SDK的情况下构建得很好。许多Windows示例现在都可以在使用Windows8.xSDK构建的DirectX上使用,并且不使用遗留的MSDN Code Gallery SDK。

解决当前问题的最小解决方案是安装Windows 8.1 SDK或Visual 2013远程调试工具(x86x64),以获得为操作系统安装的SDKDebugLayers的正确版本,但请记住,弗兰克·露娜的书已经过时了。有关其他注释,请参见Book Recommendations

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25423371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档