Directx 第一次机会例外
我正在学习DirectX11的游戏编程教程。当我运行示例代码时,会出现以下错误:Directx 第一次机会例外,directx,directx-11,Directx,Directx 11,我正在学习DirectX11的游戏编程教程。当我运行示例代码时,会出现以下错误: First-chance exception at 0x76E12EEC in Chapter1.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0307E824. HRESULT:0x887A0004 问题似乎出现在以下代码中的featureLevel和creationFlag中: hr = D3D11Cre
First-chance exception at 0x76E12EEC in Chapter1.exe: Microsoft C++ exception: Platform::COMException ^ at memory location 0x0307E824. HRESULT:0x887A0004
问题似乎出现在以下代码中的featureLevel和creationFlag中:
hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
creationFlags,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
&device,
&featureLevel,
&context);
ThrowIfFailed(hr);
但是,如果我将creationFlags和FeatureLevel的值更改为0和nullptr,代码就可以正常工作。我正在将Visual Studio 2012与Windows 8.1和Windows SDK 8.0配合使用
以下是相关代码:
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
// For debugging
creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
};
我读到了第一次机会的例外情况,它并不意味着代码确实有问题,但它不会消失。我该怎么办?问题
您只通过了D3D\u功能级别\u 11\u 1
和D3D\u功能级别\u 11\u 0
,因此D3D11CreateDevice()
函数失败,返回HRESULT
,它不是S\u OK
,并且您的ThrowFailed(hr)代码>函数抛出您遇到的异常
如果您的GPU仅支持DirectX 10,则无法创建DirectX 11硬件设备和上下文:Createdevice*()
功能将失败。为了能够在微软引入的底层硬件上使用DirectX 11 API(但不是DirectX 11功能)
如何修复?
只需使用传统的设备创建方式。
您将需要传递具有所有可能功能级别的阵列
D3D_FEATURE_LEVEL arrFeatLevels [] =
{
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,
};
因此,DirectX API将自动选择支持的最高版本。
(创建设备后,您可以通过查看返回的&featureLevel
)找到所选设备:
if(featureLevel>=D3D\U FEATURE\U LEVEL\U 11\U 0)
std::cout您的hresult错误0x887A0004解码为:不支持DXGI\u错误。检查您的卡是否支持DX11和DX11。1@Sarang我用诊断工具检查,系统信息中显示DirectX版本:DirectX 11。但驾驶员的功能级别仅达到10.1。我有Intel(R)HD图形系列图形卡。我可以更新它的驱动程序以支持Directx11吗?不认为这是可能的,dxdiag怎么说?我告诉过你dxdiag的结果。在这里检查对英特尔hd图形卡的支持:用谷歌搜索一下可以让你走得很远:)
if(featureLevel >= D3D_FEATURE_LEVEL_11_0)
std::cout << "Yay! we using D3D11! :) " << std::endl;
else if( featureLevel >= D3D_FEATURE_LEVEL_10_0)
std::cout << "Oh noes! only D3D10 available! :(" <<std::endl;
else
std::cout << "Man, where did you take that old videocard? =\ " <<std::endl;