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

时间:2016-10-27 03:22:21

标签: directx-11 msaa

我正在从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不是我想要的像素。如何用msaa采样SRV? 如何将没有msaa的无人机转换为带有msaa的SRV?

如何使用相应的hlsl代码在C ++游戏代码中启用和禁用msaa? 我是否必须为彼此保留不同的hlsl?

1 个答案:

答案 0 :(得分:1)

对于&#39;标准&#39;使用MSAA,您可以执行以下操作:

  1. 创建交换链并渲染traget视图时,请将DXGI_SWAP_CHAIN_DESC.SampleDesc.CountDXGI_SWAP_CHAIN_DESC1.SampleDesc.Count设置为2,4,8等

  2. 创建深度缓冲区/模板时,需要对D3D11_TEXTURE2D_DESC.SampleDesc.Count使用相同的样本计数。

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

  4. 创建深度缓冲区/模板视图时,需要使用D3D11_DSV_DIMENSION_TEXTURE2DMS(或传递nullptr作为视图描述,以便与​​资源完全匹配)

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

  6. 另请参阅Simple rendering

    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

    翻转样式模式

    上述技术仅适用于年龄较大的&#34; bit-blt&#34;样式翻转模式DXGI_SWAP_EFFECT_DISCARDDXGI_SWAP_EFFECT_SEQUENTIAL。对于UWP和DirectX 12,您需要使用DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD,如果您尝试使用SampleCount&gt;创建后缓冲区,则会失败。 1。

    在这种情况下,您使用SampleCount为1创建后备缓冲区,并创建自己的MSAA渲染目标2D纹理。您将渲染目标视图指向MSAA渲染目标,然后在Present之前从MSAA渲染目标调用ResolveSubresource到后退缓冲区。这与DXGI在幕后为您做的完全相同&#39;与较旧的翻盖模型。

      

    对于正确的伽玛渲染(也就是当您使用以_SRGB结尾的后备缓冲格式时),较新的翻转样式要求您使用非SRGB等效的后备缓冲格式,否则交换链创建将失败。您可以在渲染目标视图上设置SRGB格式。