首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >启用MSAAx4时如何对SRV进行采样?DirectX11 11

启用MSAAx4时如何对SRV进行采样?DirectX11 11
EN

Stack Overflow用户
提问于 2016-10-27 03:22:21
回答 1查看 2K关注 0票数 0

我正在从Introduction_to_3D_Game_Programming_with_Directx_11.学习dx11,没有msaa一切都没问题。当我启用它时,我的.fx和C++代码将不能很好地工作。是否有人也经历过这种情况,以及如何处理这种情况?

在编码之前:

代码语言:javascript
运行
复制
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时都会使用msaa。

在代码之后:

代码语言:javascript
运行
复制
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?

以及如何在C++游戏代码中启用和禁用具有相应hlsl代码的msaa?我一定要为对方保留不同的房间吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-28 16:37:00

对于“标准”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。

还请参阅简单渲染教程中的DirectX工具包

样本计数

根据Direct3D特性级别的不同,某些MSAA示例计数是特定呈现目标格式所必需的。可以使用CheckFormatSupport验证呈现目标格式支持MSAA:

代码语言:javascript
运行
复制
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级别计数:

代码语言:javascript
运行
复制
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的深度/模板格式。

翻转式模式

上述技术只适用于较旧的“位-blt”风格的翻转模式DXGI_SWAP_EFFECT_DISCARDDXGI_SWAP_EFFECT_SEQUENTIAL。对于UWP和DirectX 12,您需要使用DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD,如果尝试创建一个SampleCount > 1的back缓冲区,则会失败。

在本例中,您使用SampleCount值为1创建后台缓冲区,并创建自己的MSAA呈现目标2D纹理。您的呈现目标视图指向您的MSAA呈现目标,在Present之前,您可以从MSAA呈现目标到后台缓冲区调用ResolveSubresource。这和DXGI在旧的翻盖模型“幕后”为你做的完全一样。

对于伽马正确的呈现(也就是当您使用以_SRGB结尾的回缓冲格式时),较新的翻转样式要求您使用与后台缓冲区格式等效的非SRGB格式,否则空白链创建将失败。您可以在呈现目标视图上设置SRGB格式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40275577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档