在创建交换链时,我收到有关多重采样的DXGI错误,尝试解决该错误数小时后需要一些帮助。
我正在设置一个用于学习Direct3D 11的简单窗口。我尝试更改DXGI_SWAP_CHAIN_DESC1结构中的SampleDesc.Count和SampleDesc.Quality,但是仍然出现错误。
// dxgiFactory is using interface IDXGIFactory7
// d3dDevice5 is using interface ID3D11Device5
ComPtr<IDXGISwapChain1> dxgiSwapChain1;
DXGI_SWAP_CHAIN_DESC1 desc;
desc.Width = 800;
desc.Height = 400;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.Stereo = FALSE;
desc.SampleDesc.Count = 0;
desc.SampleDesc.Quality = 0;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.BufferCount = 3;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
desc.AlphaMode = DXGI_ALPHA_MODE_STRAIGHT;
desc.Flags = 0;
hr = dxgiFactory->CreateSwapChainForHwnd(d3dDevice5.Get(), hWnd, &desc, nullptr, nullptr, &dxgiSwapChain1);
调试输出:
DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD) do not support multisampling.
如何解决此错误?
答案 0 :(得分:0)
TL; DR 要么将翻转模型更改为较旧的DXGI_SWAP_EFFECT_DISCARD
,要么创建您明确解析的MSAA渲染目标。
ResolveSubresource
到交换链反向缓冲区(或其他一些单样本缓冲区),然后Present
。有关详细的代码示例,请参见GitHub。
您也无法使用新的
DXGI_FORMAT_*_SRGB
模型将其创建为DXGI_SWAP_EFFECT_FLIP_*
伽马校正交换链。您可以为不是sRGB的交换链创建DXGI_FORMAT_*_SRGB
的“渲染目标视图”,以达到相同的效果。在MSAA和sRGB以及Windows 10 Fall Creators Update(16299)或更高版本中修复的新翻转模型上,有些麻烦。如果您使用的是DirectX 12,则不能选择使用较早的交换效果,因此必须直接实现MSAA渲染目标。同样,请参见GitHub。
在“ Direct-Direct 12 / Vulkan之前”的日子里,DirectX通过在幕后为您做大量的事情来轻松启用MSAA。它将创建一个非MSAA渲染目标进行显示,还给您一个MSAA渲染目标进行渲染,并作为Present
的一部分为您解决问题。这很容易,但是也有点浪费。
使用DirectX 12的新“无魔术”方法,您必须在应用程序中明确地执行此操作。在真实游戏中,您无论如何都要这样做,因为您通常要进行大量后处理,并且希望在Present
之前做好解析,甚至要进行其他种类的解析(FXAA,MLAA,SMAA)。例如:
Render 3D scene to a floating-point MSAA render target
->
Resolve to a single-sample floating-point render target
->
Perform tone-mapping/color-grading/blur/bloom/etc.
->
Render UI/HUD
->
Perform HDR10 signal generation/gamma-correction/color-space warp
->
Present
从该流程中可以看到,除了玩具示例或示例代码之外,使交换链成为MSAA是很愚蠢的。
要了解现代游戏中有多少次正在进行渲染,请查看this blog post