【发布时间】:2018-11-08 13:27:54
【问题描述】:
我正在尝试用 C++ 初始化 Direct3D11。在安装了 Visual Studio 的机器上(所有这些都在 Windows 10 上运行),它运行良好。 在其他计算机上(未安装 Visual Studio,Windows 10 和 7)它返回 E_INVALIDARG。
标志 P_FeatureLevelsSupported 在这些计算机上显示 0。在我的上面写着 D3D_FEATURE_LEVEL_11_1。 所以我猜这与 DirectX 安装有关,或者可能是因为缺少 SDK(但这不会很奇怪吗?:D)
通过运行 dxdiag,我知道那些机器支持 DirectX11_0。
有什么我需要安装的吗? 该软件必须在我们客户的 PC 上运行。
导致错误的代码:
const 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,
};
D3D_FEATURE_LEVEL P_FeatureLevelsSupported;
//see microsoft documentation, we use 11_1 or 11_0 if 11_1 is not supported by the client machine
//https://docs.microsoft.com/en-us/windows/desktop/direct3d11/overviews-direct3d-11-devices-initialize
result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, lvl, _countof(lvl), D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &P_FeatureLevelsSupported, &deviceContext);
if(result == E_INVALIDARG) //check with FEATURE_LEVEL_11_0
D3D11CreateDeviceAndSwapChain(NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
D3D11_CREATE_DEVICE_DEBUG,
&lvl[1],
_countof(lvl) - 1,
D3D11_SDK_VERSION,
&swapChainDesc,
&swapChain,
&device,
&P_FeatureLevelsSupported,
&deviceContext);
提前致谢:)
【问题讨论】:
-
您在
D3D11_CREATE_DEVICE_DEBUG周围缺少一个#ifdef _DEBUG守卫,因此您的所有构建都强制使用它。见this blog post。 -
请注意,如果您尝试在缺少 KB 2670838 的 Windows 7 计算机上运行此程序,则您可以也获取
E_INVALIDARG,因为使用了D3D_FEATURE_LEVEL_11_1只有 DirectX 11.1 或更高版本的运行时“知道”。 -
是的,它会修复它。感谢您提供有关 Windows 7 的信息。
标签: c++ 3d directx directx-11 graphical-programming