D3D11CreateDeviceAndSwapChain未能成功

时间:2016-01-06 22:18:55

标签: c++ visual-studio directx directx-11 direct3d

我目前有一个for循环,一旦hr成功就应该打破,但它没有成功,这导致我后来的问题。

pbMyImage.Image = pbMyImage.InitialImage;

显然,for循环中的D3D11CreateDeviceAndSwapChain返回一个非成功的值,而且很奇怪的是,当我在另一台PC上运行这个程序时,它运行正常!我更新了所有的驱动程序,重新启动了我的电脑并卸载了所有的防病毒软件,但仍然没有运气。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您尚未说明您使用的操作系统,但最可能的原因是您的系统没有安装正确的Direct3D SDK调试层。在这种情况下,如果您尝试使用D3D11_CREATE_DEVICE_DEBUG创建设备,则会失败。快速测试是指您的Release构建是否成功创建了设备,但您的​​Debug版本没有。

要为您的操作系统安装正确的SDK图层:

  • Windows 7 RTM - >传统的DirectX SDK将会这样做
  • Windows 7 SP1 KB2670838更新(又名DirectX 11.1) - >你必须安装Windows 8.x SDK;旧版DirectX SDK版本已过期
  • Windows 8 Windows 8.1 - > Windows 8.x SDK安装它
  • Windows 10 - >现在这是Windows 10的Feature On Demand。请注意,如果您从10240升级到10586,则需要重新启用FOD。

请参阅Direct3D SDK Debug Layer Tricks

另一种可能性是您的系统没有功能级别10.0或更高版本的视频卡,但考虑到代码尝试使用WARP,它可以使用它。

请参阅Anatomy of Direct3D 11 Create Device

  

您应该查看DirectX Tool KitDirect3D Win32 Game Template

答案 1 :(得分:0)

正如你所说,同样的代码在其他机器上运行完美,这意味着你的gpu中有问题,尝试使用WARP或参考设备运行,从列表中删除D3D_DRIVER_TYPE_HARDWARE并重试。

尝试使用

D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };

并在此处阅读有关驱动程序类型的详细信息What's the difference between WARP drivers,reference drivers and software drivers?

答案 2 :(得分:0)

最后解决了这个问题。

Microsoft发布了Windows 10更新,可自动删除对DirectX11的支持。必须重新启用它。如果有人在Windows 10中遇到此问题,要重新启用DirectX11,请转到:

设置 - >应用 - >管理 - >添加额外的图形支持

(显然我需要等待21个小时才能接受我自己的答案......)

答案 3 :(得分:-1)

根据我对DX11和COM的微薄了解:

  1. 根据rastertek.com,以下是相关的代码段和解释:
  2.   

    请注意,如果用户没有DirectX 11视频卡,则此功能调用将无法创建设备和设备上下文。此外,如果您自己测试DirectX 11功能并且没有DirectX 11视频卡,那么您可以将D3D_DRIVER_TYPE_HARDWARE替换为D3D_DRIVER_TYPE_REFERENCE,而DirectX将使用您的CPU来绘制而不是视频卡硬件。请注意,它的速度提高了1/1000,但对于那些在所有机器上都没有DirectX 11视频卡的人来说这是个好消息。

    if (hr == E_OUTOFMEMORY) {
    //do whatever
    }
    

    尝试将驱动程序类型标志更改为D3D_DRIVER_TYPE_REFERENCE以进行调试。如果可行,您可能没有DX11 GPU。

    1. 根据另一个stackoverflow question,所选答案可能会在将来使用,并且MSDN在DX11 HRESULT返回码和COM article上有error handling
    2. 您现在可以做的最好的事情是通过将MSDN文章中的每个枚举传递到if语句来查找HRESULT的值。例如:

      {{1}}