首页 > 解决方案 > 如何阻止 Direct3D 11 将全屏拉伸到显示器大小?

问题描述

我正在尝试使我的 Direct3D 窗口全屏,分辨率为 800x600。但是,我尝试的所有操作都会使屏幕拉伸以覆盖整个显示器,而不是仅占用两侧有黑条的 800x600 区域。光标也被拉伸。

我用这个 DXGI_SWAP_CHAIN_DESC 创建我的交换链:

DXGI_SWAP_CHAIN_DESC sd{};
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 0;
sd.BufferDesc.RefreshRate.Denominator = 0;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = hWnd;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;

然后我使用以下代码设置屏幕分辨率:

DEVMODEW devMode{};
devMode.dmSize = sizeof(devMode);
devMode.dmPelsWidth = width;
devMode.dmPelsHeight = height;
devMode.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH;
LONG res = ChangeDisplaySettingsW(&devMode, CDS_FULLSCREEN);

最后我将交换链设置为全屏:

HRESULT hr = swap->SetFullscreenState(on, nullptr);

此外,在我的窗口过程中,每当收到 WM_SIZE 时,我都会调用它:

swapChain.reset(); // Destroy swap chain
context->ClearState();
if (FAILED(swap->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0))) throw Exception("Failed to resize buffers");
swapChain.emplace(swap.Get(), device.Get(), context.Get(), hWnd); // Recreate swap chain

我已经尝试在 DXGI_SWAP_CHAIN_DESC 和 ResizeBuffers 中使用 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,并使用我想要的大小调用IDXGISwapChain::ResizeTarget,但我仍然遇到同样的问题。

标签: c++windowsdirect3ddirect3d11

解决方案


推荐阅读