D3D11CreateDeviceAndSwapChain,HRESULT"应用程序拨打无效电话。"?

时间:2016-03-13 05:03:48

标签: c++ winapi directx rendering directx-11

因此,就像标题所述,我正在设置HRESULTD3D11CreateDeviceAndSwapChain并检查它是否失败。显然每次都会这样做,当我通过使用

显示错误消息时
_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传递给交换链。

1 个答案:

答案 0 :(得分:1)

<强>问题

在将HWND发送到CreateDeviceAndSwapChain()函数时,我有一个小混淆,将原来的HWND与另一个交换。

<强>解决方案

回过头来第四次查看我的代码之后,我发现混乱发生在我的主框架类中,我通过删除其他HWND的二次无用创建解决了这个问题,并修复了他们之间的名称有所变化。

我希望这篇文章可以帮助其他人收到我在上面帖子中收到的错误,因为它只是交换链没有收到工作和活动HWND。一个简单的修复但很难找到。