D3D11CreateDeviceAndSwapChain Fails to succeed
D3D11CreateDeviceAndSwapChain Fails to succeed
我目前有一个for循环,一旦hr成功,就应该中断它,但它没有成功,这会在以后给我带来问题。
HRESULT hr = S_OK;
UINT createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = ARRAYSIZE(driverTypes);
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = _WindowWidth;
sd.BufferDesc.Height = _WindowHeight;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = _hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
{
_driverType = driverTypes[driverTypeIndex];
hr = D3D11CreateDeviceAndSwapChain(nullptr, _driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,
D3D11_SDK_VERSION, &sd, &_pSwapChain, &_pd3dDevice, &_featureLevel, &_pImmediateContext);
if (SUCCEEDED(hr))
break;
}
很明显,for循环中的D3D11CreateDeviceAndSwapChain返回的值不是successed,更糟糕的是,当我在另一台电脑上运行这个程序时,它运行得很好!我已经更新了所有的驱动程序,重新启动了我的电脑,卸载了所有的防病毒软件,但仍然没有运气。有什么想法吗?
您尚未说明正在使用的操作系统,但最有可能的故障原因是您的系统没有安装正确的Direct3D SDK调试层。在这种情况下,如果您尝试创建具有D3D11_CREATE_DEVICE_DEBUG
的设备,它将失败。一个快速测试是,如果您的Release版本成功创建了设备,但Debug版本没有。
要为您的操作系统安装正确的SDK层:
- Windows 7 RTM->传统的DirectX SDK可以做到这一点
- Windows 7 SP1与KB2670838更新(又名DirectX 11.1)->您必须安装Windows 8.x SDK;旧版DirectX SDK版本已过期
- Windows8或Windows 8.1->Windows8.x SDK安装它
- Windows 10->这是Windows 10的一项按需功能。请注意,如果您从10240升级到10586,则需要重新启用FOD
请参阅Direct3D SDK调试层技巧
另一种可能性是,您的系统没有Feature Level 10.0或更高版本的视频卡,但如果代码尝试使用WARP,则可以使用它。
参见Direct3D 11创建设备的解剖
您应该查看DirectX工具包和Direct3D Win32游戏模板。
最终解决了问题。
微软发布了Windows10的更新,自动删除了对DirectX11的支持。必须重新启用。如果有人在Windows 10中遇到这个问题,要重新启用DirectX11,请转到:
设置->应用程序->管理->添加额外的图形支持
(显然我需要等待21个小时才能接受我自己的答案…)
正如您所说,相同的代码在其他机器上运行得很好,这意味着您的gpu中有问题,请尝试使用WARP或Reference设备运行,从列表中删除D3D_DRIVER_TYPE_HARDWARE,然后重试。
尝试使用
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
请在此处阅读有关驱动程序类型的详细信息What';WARP驱动程序、参考驱动程序和软件驱动程序之间的区别是什么?
根据我自己对DX11和COM:的理解
- 根据rastertek.com,以下是相关的代码片段和解释:
请注意,如果用户没有DirectX 11视频卡,此函数调用将无法创建设备和设备上下文。此外,如果您自己正在测试DirectX 11功能,但没有DirectX 11视频卡,则可以用D3D_DRIVER_TYPE_REFERENCE替换D3D_DRIVER_TYPE_HARDWARE,DirectX将使用您的CPU而不是视频卡硬件进行绘制。请注意,它的运行速度是1/1000,但对于那些还没有在所有机器上安装DirectX 11视频卡的人来说,这是很好的。
// Create the swap chain, Direct3D device, and Direct3D device context.
result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1,
D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
if(FAILED(result))
{
return false;
}
出于调试目的,请尝试将驱动程序类型标志更改为D3D_driver_type_REFERENCE。如果这是有效的,你可能没有DX11 GPU。
- 根据另一个stackoverflow问题,所选的答案可能对您将来有用,MSDN也有一篇关于DX11 HRESULT返回代码和COM错误处理的文章
现在可以做的最好的事情是通过将MSDN文章中的每个枚举传递到if语句中来找到HRESULT的值。例如:
if (hr == E_OUTOFMEMORY) {
//do whatever
}
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- OpenGL VBO Indexing ( How to compute Index Array)
- 为什么我会" void value not ignored as it ought to be"?
- D3D11CreateDeviceAndSwapChain Fails to succeed