我正在运行Windows7。使用DxDiag时,它将版本显示为11。
当我使用可以访问Windows API的Visual Studio 2012时,它可以运行功能级别为D3D_FEATURE_LEVEL_11_1的代码
所以我感到困惑,我的DirectX版本的确切版本是什么?
这里有许多令人困惑的因素在起作用,因此让我们一次考虑一个因素:
D3DCreateDevice
即使在Windows 8.x上也将pFeatureLevels传递为NULL,仍然不会获得D3D_FEATURE_LEVEL_11_1
。这是出于向后兼容的原因,并确保在NULL使您获得9.1-11.0时,行为不会改变。您必须手动在数组中列出11.1值才能获得它-假设system + driver组合实际上支持它。请注意,如果确实在阵列中包含11.1,则E_INVALIDARG
在Windows Vista SP2,Windows 7 RTM或Windows 7 SP1(不带KB2670838)上,调用将失败。D3D_FEATURE_LEVEL_11_1
或任何新的可选硬件功能,因为它不包括对新的WDDM 1.2驱动程序模型的支持。您必须使用Windows 8或更高版本才能D3D_FEATURE_LEVEL_11_1
使用WDDM 1.2驱动程序和适当的硬件。请参阅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功能级别进行假设,而应该安装哪个版本的DirectX,反之亦然。
有关设备创建和DirectX 11.x版本检测的各种细微差别的详细信息,请参见这篇文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句