【问题标题】:DirectX - CreateDeviceAndSwapChain returns E_INVALIDARGDirectX - CreateDeviceAndSwapChain 返回 E_INVALIDARG
【发布时间】: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


【解决方案1】:

您要求通过传入D3D11_CREATE_DEVICE_DEBUG 创建调试 设备。要成功,您必须在您的开发机器上安装 D3D11*SDKLayers.dll。有关详细信息,请参阅here,其中包括:

调试层调试层提供了广泛的附加参数 和一致性验证(例如验证着色器链接和 资源绑定、验证参数一致性和报告 错误描述)。

要创建支持调试层的设备,您必须安装 DirectX SDK(获取 D3D11SDKLayers.dll),然后指定 调用 D3D11CreateDevice 时的 D3D11_CREATE_DEVICE_DEBUG 标志 函数或 D3D11CreateDeviceAndSwapChain 函数。如果你跑 您的应用程序启用了调试层,该应用程序将 慢得多。但是,为了确保您的应用程序是干净的 发布之前的错误和警告,请使用调试层。更多 信息,请参阅使用调试层调试应用程序。

注意

对于 Windows 8,要创建支持调试层的设备, 安装适用于 Windows 8 的 Windows 软件开发工具包 (SDK) 以 获取 D3D11_1SDKLayers.dll。

如果您在客户机器上不需要调试设备,只需删除该标志即可。

【讨论】:

  • 谢谢,有帮助,我完全忽略了它......我想我太关注功能级别了。
  • 该页面缺少 Windows 10 的说明:您可以通过按需安装 图形工具 功能启用调试层。 SDK 不会安装它。
  • 嗯,好的。所以我猜你也可以用 Visual Studio 2017 安装它......因为我们没有在任何 PC 上这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2023-03-13
相关资源
最近更新 更多