创建d3d11设备和交换链的代码无法在某些计算机上运行并返回E_INVALIDARG错误。 对于具有相同版本的DirectX的计算机,这也有所不同。 我似乎没有找到不同行为的原因。
DXGI_MODE_DESC bufferDesc;
ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));
bufferDesc.Width = width;
bufferDesc.Height = height;
bufferDesc.RefreshRate.Numerator = 60;
bufferDesc.RefreshRate.Denominator = 1;
bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));
swapChainDesc.BufferDesc = bufferDesc;
swapChainDesc.SampleDesc.Count = aaCount;
swapChainDesc.SampleDesc.Quality = aaQuality;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 1;
swapChainDesc.OutputWindow = *hwnd;
swapChainDesc.Windowed = TRUE;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
//results in E_INVALIDARG in some cases
hr = D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
NULL,
nullptr,
NULL,
D3D11_SDK_VERSION,
&swapChainDesc,
&SwapChain,
&d3d11Device,
nullptr,
&d3d11DevCon);
ID3D11Texture2D* BackBuffer;
hr = SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)(&BackBuffer) );
hr = d3d11Device->CreateRenderTargetView( BackBuffer, nullptr, &renderTargetView );
答案 0 :(得分:1)
更换' Flags'使用D3D11_CREATE_DEVICE_DEBUG的参数(当前为NULL),您将在输出中收到一条人类可读的错误消息,告诉您错误。
答案 1 :(得分:0)
问题是抗锯齿的设置很高(aaCount,aaQuality),有些系统无法处理它们,因此无法创建D3D11Device / Swapchain。
答案 2 :(得分:0)
从评论中发现,设备创建失败的原因是多重采样质量和/或计数的不受支持的组合。在设备创建之后,在使用D3D11CreateDevice
功能创建交换链之前,然后ID3D11Device::CheckMultisampleQualityLevels
,可以查询此支持。然后,可以使用适当的参数创建交换链。
此外,基于功能级别有一些保证的MSAA支持,因此,如果在创建设备时需要某个功能级别,它也可以是验证MSAA参数的方法(例如,仍然使用{ {1}}功能)。从CheckMultisampleQualityLevels文档中,这种有保障的支持是:
请注意,FEATURE_LEVEL_10_1设备需要为除R32G32B32A32和R32G32B32之外的所有渲染目标支持4x MSAA。 FEATURE_LEVEL_11_0设备需要支持所有渲染目标格式的4x MSAA,以及除R32G32B32A32格式之外的所有渲染目标格式的8x MSAA。