创建Swapchain时,如何解决此多样采样错误



在创建Swapchain时,我会遇到有关多样化的DXGI错误,并且在尝试解决此错误后需要一些帮助。

我正在设置一个简单的学习direct3d11。

// 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.

如何解决此错误?

tl; dr 要么将翻转模型更改为旧的DXGI_SWAP_EFFECT_DISCARD,要么创建您明确解决的MSAA渲染目标。

  1. 将您的交换链创建为一个样本(即没有MSAA(。
  2. 创建一个使用一个或多个样本(即MSAA(的渲染目标纹理。
  3. 为您的MSAA渲染目标创建您的渲染目标视图
  4. 每个帧,渲染到您的MSAA渲染目标,然后ResolveSubresource到Swapchain Backbuffer或其他一些单样本缓冲区 - 然后Present

有关详细的代码示例,请参见github。

您也无法使用新的DXGI_SWAP_EFFECT_FLIP_*型号将其作为DXGI_FORMAT_*_SRGB伽马校正的Swapchain创建。您可以为SRGB的Swapchain创建一个DXGI_FORMAT_*_SRGB的渲染目标视图,以获得相同的效果。在Windows 10 Fall Creators Update(16299(或更高版本中固定的新Flip模型(16299(或更高版本中,有点陷入了MSAA和SRGB。

如果您使用的是DirectX 12,则无需使用旧的交换效果,因此您必须直接实现MSAA渲染目标。再次,请参阅github。

在'directx 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

您可以从该流程中看到,除了玩具示例或示例代码外,要有Swapchain是MSAA是非常愚蠢的。

要了解现代游戏在做多次渲染的情况下,请参见此博客文章

请参阅DX 11和DX12

的Directx工具套件

更新:我在最近的博客文章

中详细介绍了这一点

最新更新