DirectX-CreateDeviceAndSwapChain返回E_INVALIDARG

时间:2018-11-08 13:27:55

标签: c++ 3d directx directx-11 graphical-programming

我正在尝试使用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);

预先感谢:)

1 个答案:

答案 0 :(得分:2)

您要通过传入D3D11_CREATE_DEVICE_DEBUG来创建 debug 设备。为此,您必须在开发计算机上安装 D3D11 * SDKLayers.dll 。有关详细信息,请参见here

  

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

     

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

     

注意

     

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

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