首页 > 解决方案 > D3D11CreateDeviceAndSwapChain 不会在第二台显示器上切换到全屏

问题描述

我遇到的最初问题是我无法让我的游戏在我的第二台显示器上全屏运行。转到显示设置并将主显示从第 2 个切换到第 1 个,让我的游戏全屏运行,没有任何问题。我的两台显示器的分辨率相同,因此问题必须出在其他地方。 显示

负责全屏切换的代码如下所示:

// create device and front/back buffers
if( FAILED( hr = D3D11CreateDeviceAndSwapChain( 
    nullptr,
    D3D_DRIVER_TYPE_HARDWARE,
    nullptr,
    createFlags,
    nullptr,
    0,
    D3D11_SDK_VERSION,
    &sd,
    &pSwapChain,
    &pDevice,
    nullptr,
    &pImmediateContext ) ) )
{
    throw CHILI_GFX_EXCEPTION( hr,L"Creating device and swap chain" );
}

而交换链描述sd之前是这样创建的:

// create device and swap chain/get render target view
DXGI_SWAP_CHAIN_DESC sd = {};
sd.BufferCount = 1;
sd.BufferDesc.Width = Graphics::ScreenWidth;
sd.BufferDesc.Height = Graphics::ScreenHeight;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 1;
sd.BufferDesc.RefreshRate.Denominator = 60;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = key.hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = !f;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

f设置为true并且代码完全按照我希望它在监视器 1 上执行的操作,但是窗口在监视器 2 上保持窗口化。hrS_OK表明一切正常。

DXGI 参考说:

我们建议您创建一个窗口化交换链,并允许最终用户通过 IDXGISwapChain::SetFullscreenState 将交换链更改为全屏;

使用交换链方法快速修改代码以设置全屏状态会导致:

hr = pSwapChain->SetFullscreenState(TRUE, vOutput[0]);

HRESULThr表示该方法以E_FAIL.

作为一项额外的测试,更改vOutput[0]vOutput[1]让我的游戏在另一台显示器上全屏运行,没有任何问题。

试图找到这方面的信息导致我访问了多个 Steam 论坛帖子,其中不同的用户在尝试全屏播放诸如Devil May Cry 4Company of Heroes 2Resident Evil 5等游戏时遇到相同类型的错误。所有这些帖子的共同点是游戏没有在第二台显示器上全屏运行。从这些帖子中的信息中,我还发现如果屏幕分辨率设置为 1680x1050 或更低,则全屏将起作用。

这让我相信实际的错误可能在 direct3D 文件中的某个地方,但是在哪里呢?

为什么SetFullscreenState返回E_FAIL并且D3D11CreateDeviceAndSwapChain什么都不做,我怎样才能让它工作?

如果不可能,那么SetFullscreenState实现相同目标的替代品是什么?

标签: c++directxdirect3ddxgi

解决方案


推荐阅读