Первоначальная проблема, с которой я столкнулся, заключалась в том, что я не смог запустить мою игру на полном экране на втором мониторе.Переходя к настройкам дисплея и переключая основной дисплей со второго на первый, я могу без проблем запускать игру на весь экран.Разрешение на обоих моих мониторах одинаково, поэтому проблема должна быть в другом месте.![displays](https://i.stack.imgur.com/yyZWs.png)
Код, отвечающий за полноэкранный обмен, выглядит следующим образом:
// 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 с окном 2. hr
также S_OK
говорит о том, что все прошло хорошо.
Справочник DXGI гласит:
Мы рекомендуем создать оконную цепочку обмена и позволить конечному пользователю изменить цепочку обмена на полный экранчерез IDXGISwapChain :: SetFullscreenState;
Быстрое изменение кода для установки полноэкранного состояния с помощью метода цепочки обмена приводит к:
hr = pSwapChain->SetFullscreenState(TRUE, vOutput[0]);
HRESULT hr
говорит, чтометод не удался с E_FAIL
.
В качестве дополнительного теста, изменение vOutput[0]
на vOutput[1]
заставляет мою игру работать на полном экране на другом мониторе без каких-либо проблем.
Попытка найтиинформация о нейs привел меня к нескольким сообщениям на Steam на форуме, где разные пользователи сталкивались с одним и тем же типом ошибки при попытке перейти на полный экран в таких играх, как Devil May Cry 4 , Company of Heroes 2 или Обитель зла 5 .Общим для всех этих постов было то, что игра не работала в полноэкранном режиме на втором мониторе.Из информации в этих постах я также обнаружил, что полноэкранный режим будет работать, если разрешение экрана установлено на 1680x1050 или ниже.
Это наводит меня на мысль, что настоящая ошибка может быть где-то внутри файлов Direct3D, но где?
Почему SetFullscreenState
возвращает E_FAIL
и D3D11CreateDeviceAndSwapChain
ничего не делает и как я могу заставить его работать?
Если это невозможно, чем можно заменить SetFullscreenState
, которыйдостигает той же цели?