在创建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渲染目标。
- 将您的交换链创建为一个样本(即没有MSAA(。
- 创建一个使用一个或多个样本(即MSAA(的渲染目标纹理。
- 为您的MSAA渲染目标创建您的渲染目标视图
- 每个帧,渲染到您的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工具套件更新:我在最近的博客文章