对于“标准”MSAA 使用,您可以执行以下操作:
创建交换链和渲染跟踪视图时,将DXGI_SWAP_CHAIN_DESC.SampleDesc.Count
或 设置DXGI_SWAP_CHAIN_DESC1.SampleDesc.Count
为 2、4、8 等。
创建深度缓冲区/模板时,您需要对D3D11_TEXTURE2D_DESC.SampleDesc.Count
.
创建渲染目标视图时,您需要使用D3D11_RTV_DIMENSION_TEXTURE2DMS
(或传递nullptr
视图描述,使其与资源完全匹配)
创建深度缓冲区/模板视图时,您需要使用D3D11_DSV_DIMENSION_TEXTURE2DMS
(或传递nullptr
视图描述,使其与资源完全匹配)
渲染时,您需要使用D3D11_RASTERIZER_DESC.MultisampleEnable
设置为 TRUE 的光栅化器状态。
另请参阅DirectX Tool Kit的简单渲染教程
样本数
根据 Direct3D 功能级别,特定呈现目标格式需要一些 MSAA 样本计数。使用可以CheckFormatSupport
用来验证渲染目标格式是否支持 MSAA:
UINT formatSupport = 0;
if (FAILED(device->CheckFormatSupport(m_backBufferFormat, &formatSupport)))
{
throw std::exception("CheckFormatSupport");
}
UINT flags = D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE
| D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
if ( (formatSupport & flags) != flags )
{
// error
}
然后,您可以使用CheckMultisampleQualityLevels
来验证样本计数是否受支持。此代码查找特定格式的最高支持 MSAA 级别计数:
for (m_sampleCount = D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT;
m_sampleCount > 1; m_sampleCount--)
{
UINT levels = 0;
if (FAILED(device->CheckMultisampleQualityLevels(m_backBufferFormat,
m_sampleCount, &levels)))
continue;
if ( levels > 0)
break;
}
if (m_sampleCount < 2)
{
// error
}
您还可以验证要使用的深度/模板格式支持D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
。
翻转样式模式
上述技术仅适用于较旧的“bit-blt”风格翻转模式 DXGI_SWAP_EFFECT_DISCARD
或DXGI_SWAP_EFFECT_SEQUENTIAL
. 对于 UWP 和 DirectX 12,您必须使用,DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
否则DXGI_SWAP_EFFECT_FLIP_DISCARD
如果您尝试创建 SampleCount > 1 的后台缓冲区,则会失败。
在这种情况下,您创建一个 SampleCount 为 1 的后缓冲区,并创建您自己的 MSAA Render Target 2D 纹理。您的渲染目标视图指向您的 MSAA 渲染目标,并且在您从 MSAA 渲染目标Present
调用ResolveSubresource
到 backbuffer 之前。这与 DXGI 为您在“幕后”使用较旧的翻转模型所做的事情完全相同。
对于 gamma-correct 渲染(也就是当您使用以 结尾的 backbuffer 格式时_SRGB
),较新的翻转样式要求您使用非 SRGB 等效的 backbuffer 格式,否则交换链创建将失败。您改为在渲染目标视图上设置 SRGB 格式。