创建交换链时如何解决此多次采样错误?

时间:2019-05-24 06:28:22

标签: directx-11

在创建交换链时,我收到有关多重采样的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.

如何解决此错误?

1 个答案:

答案 0 :(得分:0)

TL; DR 要么将翻转模型更改为较旧的DXGI_SWAP_EFFECT_DISCARD,要么创建您明确解析的MSAA渲染目标。

  1. 创建交换链作为一个示例(即无MSAA)。
  2. 创建使用一个或多个样本(即MSAA)的渲染目标纹理。
  3. 为MSAA渲染目标创建渲染目标视图
  4. 每个帧,先渲染到您的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

请参阅DX 11DX12的DirectX工具包