因此,就像标题所述,我正在设置HRESULT
到D3D11CreateDeviceAndSwapChain
并检查它是否失败。显然每次都会这样做,当我通过使用
_com_error error(hresult);
LPCSTR errorText = error.ErrorMessage();
MessageBox(hwnd, errorText, "Fatal Error", MB_OK);
以下消息是MessageBox
,
The application made a call that is invalid. Either the parameters of the call or the state of the object was incorrect.
Enable the D3D debug layer in order to see details via debug messages.
我使用
创建交换链描述DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = screenWidth;
swapChainDesc.BufferDesc.Height = screenHeight;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 0; // Numerator and denominator are as they are due to a bug in calculation, leaving me with a number around 760000 while calculating for VSync.
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.Windowed = true;
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapChainDesc.Flags = 0;
featureLevel = D3D_FEATURE_LEVEL_11_0;
然后我尝试使用
创建我的交换链result = D3D11CreateDeviceAndSwapChain(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
0,
&featureLevel,
1,
D3D11_SDK_VERSION,
&swapChainDesc,
&m_swapChain,
&m_device,
NULL,
&m_deviceContext);
所以我的问题是,我错过了哪个参数或配置错误会导致这个奇怪的错误?提前谢谢你。
注意:我们已尝试将D3D_DRIVER_TYPE_HARDWARE
更改为REFERENCE
,但不起作用。
注意:如果您想查看我可能忘记提及的完整源代码或其他有用信息,可以找到here。
更新:调试时,我收到此错误,
DXGI ERROR: IDXGIFactory::CreateSwapChain: No target window specified in DXGI_SWAP_CHAIN_DESC, and no window associated with owning factory. [ MISCELLANEOUS ERROR #6: ]
这清楚地表明我的问题是交换链没有被赋予附加的窗口,因此失败了。我不明白为什么会这样,因为在我的游戏课中,我用窗口初始化窗口,
m_HWND = CreateWindowEx(
WS_EX_APPWINDOW,
(LPCSTR)m_AppName,
"Engine",
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP,
xPos,
yPos,
screenWidth,
screenHeight,
NULL,
NULL,
m_hInst,
NULL);
并通过函数将HWND传递给交换链。
答案 0 :(得分:1)
<强>问题强>:
在将HWND
发送到CreateDeviceAndSwapChain()
函数时,我有一个小混淆,将原来的HWND
与另一个交换。
<强>解决方案强>:
回过头来第四次查看我的代码之后,我发现混乱发生在我的主框架类中,我通过删除其他HWND
的二次无用创建解决了这个问题,并修复了他们之间的名称有所变化。
我希望这篇文章可以帮助其他人收到我在上面帖子中收到的错误,因为它只是交换链没有收到工作和活动HWND
。一个简单的修复但很难找到。