如何确定系统DirectX是11还是11.1?

如何确定系统DirectX是11还是11.1?,directx,directx-11,Directx,Directx 11,我正在运行Windows7。当我使用DxDiag时,它将版本显示为11 当我使用可以访问Windows API的Visual Studio 2012时,它可以运行功能级别为D3D_feature_level_11_1的代码 所以我很困惑,我的DirectX版本的确切版本是什么?DirectX功能级别 功能级别是一组定义良好的GPU功能 您的DirectX版本是11,但根据您的硬件(GPU),您可能会获得功能级别11\U 1。如果你街上的朋友有Windows8.1和一个支持图形卡,他们可能有11

我正在运行Windows7。当我使用DxDiag时,它将版本显示为11

当我使用可以访问Windows API的Visual Studio 2012时,它可以运行功能级别为D3D_feature_level_11_1的代码

所以我很困惑,我的DirectX版本的确切版本是什么?

DirectX功能级别

功能级别是一组定义良好的GPU功能

您的DirectX版本是11,但根据您的硬件(GPU),您可能会获得功能级别11\U 1。如果你街上的朋友有Windows8.1和一个支持图形卡,他们可能有11.2的功能

尽管听起来像是这样,但您至少有一些11.1功能可用。

(http://blogs.msdn.com/b/chuckw/archive/2013/02/26/directx-11-1-and-windows-7-update.aspx)

DXDIAG:即使将KB 2670838应用于Windows 7 SP1,DXDIAG仍会将其报告为“DirectX 11”


如果有疑问,我建议依赖CreateDevice(等)返回的功能级别来判断是否正确。

这里有许多混淆因素,所以让我们一次一个:

  • DXDIAG是操作系统和DirectX运行时的一部分,但也会手动更新该字符串,因此报告“DirectX”版本时,它通常不够详细/准确。对于Windows Vista SP1,它没有显示“DirectX 10.1”,而是显示“DirectX 10”。同样,在安装了Windows8和Windows7SP1+之后,它仍然显示“DirectX11”,而不是“DirectX11.1”。在Windows 8.1上,它仍然显示“DirectX 11”,而不是“DirectX 11.2”。简而言之,对于此类技术细节,DXDIAG不是您的最佳选择。您可以尝试在Windows 8.1 SDK中使用最新版本的,它在检查方面有点复杂,但仍需要随着时间的推移手动更新,因此它目前没有提到Windows 10的功能,如DX 11.3或DX 12
  • 即使在Windows 8.x上,如果将PFeatureLevel的NULL传递给
    D3DCreateDevice
    ,您仍然无法获得
    D3D\U功能\U级别\U 11\U 1
    。这是出于backcompat的原因,并确保在NULL得到9.1-11.0时行为不会改变。您必须手动列出数组中的11.1值才能得到它——假设system+driver组合实际支持它。请注意,如果在阵列中包含11.1,则在Windows Vista SP2、Windows 7 RTM或Windows 7 SP1(不含KB2670838)上,调用将失败,并带有
    E_INVALIDARG
  • Windows 7 SP1+KB2670838提供DirectX 11.1 API,但不支持
    D3D_功能\u级别\u 11_1
    或任何新的可选硬件功能,因为它不支持新的WDDM 1.2驱动程序型号。您必须使用Windows 8或更高版本,才能使用WDDM 1.2驱动程序和适当的硬件获得
    D3D_功能\u级别\u 11_1
    。看
  • 通常,Windows桌面应用程序处理所有这些问题的正确方法是:

    D3D_FEATURE_LEVEL lvl[] = {
       D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
       D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
       D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1
    };
    
    DWORD createDeviceFlags = 0;
    #ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
    #endif
    
    ID3D11Device* pDevice = nullptr;
    ID3D11DeviceContext* pContext = nullptr;
    D3D_FEATURE_LEVEL fl;
    HRESULT hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
        createDeviceFlags, lvl, _countof(lvl),
         D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
    if ( hr == E_INVALIDARG )
    {
        hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
             createDeviceFlags, &lvl[1], _countof(lvl)-1,
             D3D11_SDK_VERSION, &pDevice, &fl, &pContext );
    }
    if (FAILED(hr))
       ...
    
    然后,要检测对Direct3D 11.1的支持,请查看是否可以获得Direct3D 11.1接口:

    ID3D11Device1* pDevice1 = nullptr;
    ID3D11DeviceContext1* pContext1 = nullptr;
    hr = pDevice->QueryInterface( __uuidof( ID3D11Device1 ),
        reinterpret_cast<void**>( &pDevice1 ) );
    if ( SUCCEEDED(hr) )
    {
        // DirectX 11.1 is present, otherwise only DirectX 11.0
        (void)pContext->QueryInterface( __uuidof( ID3D11DeviceContext1 ),
             reinterpret_cast<void**>( &pContext1 ) );
    }
    
    ID3D11Device1*pDevice1=nullptr;
    ID3D11DeviceContext1*PCContext1=nullptr;
    hr=pDevice->QueryInterface(u_uidof(ID3D11Device1),
    重新解释铸件(&pDevice1));
    如果(成功(hr))
    {
    //存在DirectX 11.1,否则仅存在DirectX 11.0
    (void)pContext->QueryInterface(u_uidof(ID3D11DeviceContext1),
    重新解释cast(&pContext1));
    }
    
    不要根据安装的DirectX版本进行假设,反之亦然

    • Windows 8应用商店应用程序可以假定存在DirectX 11.1,但不能假定任何特定的Direct3D功能级别(尽管9.1是您见过的最低版本)
    • Windows 8.1应用商店应用可以假定存在DirectX 11.2,但同样不能假定Direct3D功能级别的任何内容
    • Windows phone 8.0应用程序可以假定存在DirectX 11.0,并且设备仅支持9.3
    • Windows phone 8.1应用程序可以假定存在DirectX 11.1,并且设备仅支持9.3
    • Xbox One应用程序可以假定存在DirectX 11.1。独占应用程序可以假定FL 11.1存在。共享应用程序必须使用FL 10.0
    有关设备创建和DirectX 11.x版本检测的各种细微差别的详细信息,请参阅


    有关Windows 7上DirectX 11.1的重要说明,请参阅和。

    如前所述:运行dxdiag->转到显示->检查驱动程序型号。如果您的系统中安装了WDDM 1.3而不是DirectX 11.2,如果您的WDDM 1.2而不是DirectX 11.1。

    。使用Windows 8.1、WDDM 1.3驱动程序和Direct3D 11.2 API,FL 11.0和FL 11.1视频卡可以显示一些额外的硬件功能。再见,谢谢。我已经更新了重新定位博客答案中的链接。