启用 msaa x4 时如何对 SRV 进行采样?DirectX11

How to sample a SRV when enable msaa x4?DirectX11

我正在向 Introduction_to_3D_Game_Programming_with_Directx_11 学习 dx11。 没有msaa一切正常。当我启用它时,我的 .fx 和 C++ 代码将无法正常工作。 有没有人遇到过这种情况,如何处理?

代码之前:

Texture2D gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
    float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
    texColor = gTexture1.Sample(SamAnisotropic, pin.Tex);
    return texColor;
}

因为我无法将用msaa创建的纹理绑定到一个texture2D,所以我每次都打开msaa。

代码后:

Texture2DMS<float4> gTexture1;
float4 BLEND_PS(VertexOut_SV pin) :SV_TARGET
{
    float4 texColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
    texColor = gTexture1.Load(int2(pin.Tex.x*1400, pin.Tex.y*900), 0);
    return texColor;
}

但是 texColor 不是正确的像素我 want.How 无法使用 msaa 对 SRV 进行采样? 如何将不带msaa的无人机改装成带msaa的SRV?

以及如何在对应hlsl代码的C++游戏代码中启用和禁用msaa? 我必须为彼此保留不同的 hlsl 吗?

要使用 'standard' MSAA,请执行以下操作:

  1. 创建交换链和渲染目标视图时,将 DXGI_SWAP_CHAIN_DESC.SampleDesc.CountDXGI_SWAP_CHAIN_DESC1.SampleDesc.Count 设置为 2、4、8 等

  2. 创建深度 buffer/stencil 时,您需要为 D3D11_TEXTURE2D_DESC.SampleDesc.Count 使用相同的样本数。

  3. 创建渲染目标视图时,您需要使用 D3D11_RTV_DIMENSION_TEXTURE2DMS(或为视图描述传递 nullptr,以便它与资源完全匹配)

  4. 创建深度 buffer/stencil 视图时,您需要使用 D3D11_DSV_DIMENSION_TEXTURE2DMS(或为视图描述传递 nullptr,以便它与资源完全匹配)

  5. 渲染时需要使用光栅化器状态D3D11_RASTERIZER_DESC.MultisampleEnable设置为TRUE。

另见 Simple rendering tutorial for 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
}

You can also validate the depth/stencil format you want to use supports D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET.

翻转样式模式

上述技术仅适用于较旧的 "bit-blt" 样式翻转模式 DXGI_SWAP_EFFECT_DISCARDDXGI_SWAP_EFFECT_SEQUENTIAL。对于 UWP 和 DirectX 12,您需要使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD,如果您尝试创建 SampleCount > 1 的后台缓冲区,这将失败。

在本例中,您创建了 SampleCount 为 1 的后备缓冲区,并创建了您自己的 MSAA 渲染目标 2D 纹理。您将渲染目标视图指向您的 MSAA 渲染目标,并且在您 Present 之前,您从 MSAA 渲染目标调用 ResolveSubresource 到后备缓冲区。这与 DXGI 为您 'behind the scenes' 使用较旧的翻盖模型所做的完全相同。

For gamma-correct rendering (aka when you use a backbuffer format ending in _SRGB), the newer flip styles require that you use the non-SRGB equivalent for the backbuffer format or the swapchain create will fail. You set the SRGB format on the render target view instead.