在 directx11 代码中更改全屏模式下的刷新率不起作用



我希望能够在代码中首次初始化后更改刷新率。 我用了DX11.0 据我目前所知,基本上有两种方法可以做到这一点。 第一个是使用 IDXGIFactory::CreateSwapChain 重新创建具有所需刷新率的交换链。 第二个是使用 IDXGISwapChain::ResizeTarget。用所需的刷新率填充描述。

下面是我第一种方法的代码:

DXGI_SWAP_CHAIN_DESC swapchain_desc;
ZeroMemory(&swapchain_desc,sizeof(swapchain_desc));
sSwapChain->GetDesc(&swapchain_desc);//get the description from the original swapchain
//release the backbuffer
sContext->ClearState();
sContext->Flush();
sBackBufferRenderTargetView.Release();
sBackBufferTexture.Release();
//release the current swapchain
sSwapChain.Release();
//create the new swapchain with my desired refreshrate
swapchain_desc.BufferDesc.Width = sDeviceMode.dmPelsWidth;//sDeviceMode is a device mode specified by user
swapchain_desc.BufferDesc.Height = sDeviceMode.dmPelsHeight;
swapchain_desc.BufferDesc.RefreshRate.Numerator= sDeviceMode.dmDisplayFrequency;
swapchain_desc.Windowed = false;
COMPtr<IDXGISwapChain> pSwapChain;
HRESULT hr = sDXGIFactory->CreateSwapChain(sD3D11Device,&swapchain_desc,&pSwapChain);
gAssert(SUCCEEDED(hr));
hr = pSwapChain->QueryInterface(&sSwapChain);
gAssert(SUCCEEDED(hr));
sSwapChain->SetFullscreenState(true,nullptr);

我应该提到,从原始交换链描述中获得的其他设置是完全有效的。 当我将分辨率 1280*800 和刷新率为 75HZ 传递给代码时,创建交换链的返回结果是S_OK,这意味着交换链创建成功,但是当我检查显示器硬件上显示的刷新率时,它没有改变,硬件显示分辨率为 1920*1080,刷新率为 60HZ。

然后我尝试了第二种方法,这是代码块:

DXGI_MODE_DESC mode_desc;
ZeroMemory(&mode_desc,sizeof(mode_desc));
mode_desc.Width = sDeviceMode.dmPelsWidth;
mode_desc.Width = sDeviceMode.dmPelsHeight;
mode_desc.RefreshRate.Numerator= sDeviceMode.dmDisplayFrequency;
mode_desc.RefreshRate.Denominator= 1;
mode_desc.Format = swapchain_desc.BufferDesc.Format;
mode_desc.Scaling= swapchain_desc.BufferDesc.Scaling;
hr = sSwapchain->ResizeTarget(&mode_desc);
gAssert(SUCCEEDED(hr));
sSwapChain->SetFullscreenState(true,nullptr);

sSwapchain->ResizeTarget 的返回结果也很S_OK,但我想要的刷新率没有设置为显示器。

如果有人可以指出我的错误,我们将不胜感激。

文档说您必须DXGI_SWAP_CHAIN_DESC::Flags字段中设置DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH标志才能切换视频模式。

最新更新