我遇到的原始问题是,我无法让我的游戏在我的第二台显示器上全屏运行。要显示设置并将主显示从第二个交换到第一个,让我的游戏全屏运行,没有任何问题。我的两台显示器的分辨率是相同的,因此问题必须在其他地方。
负责全屏交换的代码如下所示:
// 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上。hr
也是{{1}建议一切顺利。
DXGI参考说:
我们建议您创建一个窗口化的交换链,并允许最终用户通过IDXGISwapChain :: SetFullscreenState将交换链更改为全屏;
快速修改代码以使用交换链方法设置全屏状态会导致:
S_OK
HRESULT hr = pSwapChain->SetFullscreenState(TRUE, vOutput[0]);
表示该方法因hr
而失败。
作为额外测试,将E_FAIL
更改为vOutput[0]
可让我的游戏在另一台显示器上全屏显示,而不会出现任何问题。
尝试查找有关这方面的信息时,我发现了多个Steam论坛帖子,其中不同的用户在尝试在Devil May Cry 4,Company of Heroes 2或{{3}等游戏中全屏播放时遇到相同类型的错误}。所有这些帖子都有一个共同点就是游戏没有在第二台显示器上全屏运行。根据这些帖子中的信息,我还发现如果屏幕分辨率设置为1680x1050或更低,全屏将起作用。
这让我相信实际的bug可能在direct3D文件里面,但在哪里?
为什么vOutput[1]
返回SetFullscreenState
和E_FAIL
什么也不做,我怎样才能让它发挥作用?
如果不可能,那么实现相同目标的D3D11CreateDeviceAndSwapChain
有什么好的替代品?