【发布时间】:2020-08-26 02:49:04
【问题描述】:
我运行的是 Windows 7。当我使用 DxDiag 时,它显示的版本为 11。
当我使用可以访问 Windows API 的 Visual Studio 2012 时,它可以运行具有 D3D_FEATURE_LEVEL_11_1 功能级别的代码
所以我很困惑,我的 DirectX 版本的确切版本是什么?
【问题讨论】:
标签: directx directx-11
我运行的是 Windows 7。当我使用 DxDiag 时,它显示的版本为 11。
当我使用可以访问 Windows API 的 Visual Studio 2012 时,它可以运行具有 D3D_FEATURE_LEVEL_11_1 功能级别的代码
所以我很困惑,我的 DirectX 版本的确切版本是什么?
【问题讨论】:
标签: directx directx-11
这里有许多令人困惑的因素,所以让我们一次看一个:
D3DCreateDevice,即使在 Windows 8.x 上,您仍然不会得到 D3D_FEATURE_LEVEL_11_1。这是出于向后兼容的原因,并确保在 NULL 为您提供 9.1 - 11.0 时行为不会改变。您必须手动列出数组中的 11.1 值才能得到它——假设系统+驱动程序组合实际上支持它。请注意,如果您确实在数组中包含 11.1,则在没有 KB2670838 的 Windows Vista SP2、Windows 7 RTM 或 Windows 7 SP1 上,调用将失败并显示 E_INVALIDARG。D3D_FEATURE_LEVEL_11_1 或任何新的可选硬件功能,因为它不支持新的 WDDM 1.2 驱动程序模型。您必须使用 Windows 8 或更高版本才能获得带有 WDDM 1.2 驱动程序和适当硬件的D3D_FEATURE_LEVEL_11_1。见Microsoft Docs
一般来说,为 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 ) );
}
不要根据Direct3D Feature Level 安装的 DirectX 版本做出假设,反之亦然。
有关设备创建和 DirectX 11.x 版本检测的各种细微差别的详细信息,请参阅this post。
【讨论】:
https://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx
功能级别是一组明确定义的 GPU 功能。
您的 DirectX 版本是 11,但根据您的硬件 (GPU),您可能会获得功能级别 11_1。如果你在街上的朋友有 Windows 8.1 和支持的显卡,他们可能有 11.2 的功能。
尽管听起来,您至少可以使用一些 11.1 功能。
【讨论】:
D3D_FEATURE_LEVEL_11_2。借助 Windows 8.1、WDDM 1.3 驱动程序和 Direct3D 11.2 API,FL 11.0 和 FL 11.1 显卡可以提供一些额外的硬件功能。见MSDN
如前所述:运行 dxdiag -> 转到显示 -> 检查驱动程序型号。如果您有 WDDM 1.3,则系统中安装了 DirectX 11.2;如果您有 WDDM 1.2,则安装了 DirectX 11.1。
【讨论】:
https://walbourn.github.io/directx-11-1-and-windows-7-update/ (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 (et al) 返回的功能级别是正确的。
【讨论】: