0

Direct3D 11 アプリケーションがフルスクリーン モードからウィンドウ モードに切り替わるたびに、IDXGISwapChain::ResizeBuffers がブレークポイントをトリガーします。Visual Studio のコンソールに、「重大なエラー 0xc0000374」というメッセージが出力され、その他の情報はありません。どうやらこれは、ヒープの破損が発生したことを意味します。じゃあオーケー。ウィンドウが不愉快に私のビューを覆い隠し、ビジュアルスタジオウィンドウを制御できないため、これが発生した理由についてこれ以上の情報を得ることができません.

この MSDN ページで行われた提案に従っています。つまり、コードをコピーして貼り付けたということです。

これは私のセットアップ コードです (エラー チェックがないことは無視してください)。

DXGI_SWAP_CHAIN_DESC swap_chain_desc = { 0 };
swap_chain_desc.BufferCount = 2;
swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.OutputWindow = window::get();
swap_chain_desc.SampleDesc.Count = 1;
swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_desc.Windowed = TRUE;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

if (fullscreen == 1) {
    swap_chain_desc.BufferDesc.Width = window::desktop_width();
    swap_chain_desc.BufferDesc.Height = window::desktop_height();
} else {
    swap_chain_desc.BufferDesc.Width = window::width();
    swap_chain_desc.BufferDesc.Height = window::height();
}

HRESULT hr = D3D11CreateDeviceAndSwapChain (
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    NULL,
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &swap_chain_desc,
    &m_swap_chain,
    &m_device,
    NULL,
    &m_context
);

ID3D11Texture2D* back_buffer;
hr = m_swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&back_buffer);

hr = m_device->CreateRenderTargetView(back_buffer, NULL, &m_view);

back_buffer->Release();

m_context->OMSetRenderTargets(1, &m_view, NULL);

D3D11_VIEWPORT viewport = { 0 };
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;

if (fullscreen == 1) {
    viewport.Width = window::desktop_width();
    viewport.Height = window::desktop_height();
} else {
    viewport.Width = window::width();
    viewport.Height = window::height();
}

m_context->RSSetViewports(1, &viewport);

if (fullscreen == 1) {
    m_swap_chain->SetFullscreenState(TRUE, NULL);
}

この問題を引き起こした可能性のあるものはありますか? レンダリング コードは単なる ClearRenderTargetView であり、PeekMessage ループの後に表示されます。重要なことは何もありません。

4

1 に答える 1

0

この問題は、スワップ チェーンのフルスクリーン状態を設定する前にウィンドウを表示することで修正されました。UpdateWindow(hwnd)を呼び出すかShowWindow(hwnd, SW_SHOW)、ウィンドウ スタイルをWS_VISIBLEに設定します。CreateWindow()CreateWindowEx()

于 2014-07-17T23:41:36.647 に答える