程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用??

开发过程中遇到是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?的问题如何解决?下面主要结合日常开发的经验,给出你关于是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?的解决方法建议,希望对你解决是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?有所启发或帮助;

使用 DirectX 12 的 DirectX 工具包,我能够成功编译和运行单独的 MSAA 和 HDR 教程示例。 然而,当我将 MSAA 和 HDR 组件的相关代码组合到一个 Game.cpp 文件中时,编译失败并显示调试层消息:

D3D12 错误:ID3D12CommandList::resolveSubresource:指定的格式与源资源不兼容。格式:R10G10B10A2_UnorM,源资源格式:R16G16B16A16_float [resourcE_MANIPul8FORM_resourcE_MANIPul8FORM_resourcE_MANIPul8FORM_RESORINVE>#8

我将 HDR 示例代码用于 SDR 显示器,因此需要应用色调映射。关于调用的顺序,我在尝试解析 MSAA 渲染目标之前调用结束 HDR 场景:

// 3d rendering completed
m_hdrScene->EndScene(commandList);

if (m_msaa)
{
    // Resolve the MSAA render target.
    //PIXBeginEvent(commandList,PIX_color_DEFAulT,L"Resolve");

    auto BACkBuffer = m_deviceresources->Getrendertarget();
    ...

然后在 MSAA 解析块之后,我将色调映射语句放置如下:

// Unbind depth/stencil for Sprites (UI)
auto rtvDescriptor = m_deviceresources->GetrendertargetVIEw();
commandList->OMSetrendertargets(1,&rtvDescriptor,falSE,nullptr);

// set texture descriptor heap in prep for sprite drawing
commandList->SetDescriptorHeaps(static_cast<UINT>(std::size(heaps)),heaps);

// apply tonemapPing to hdr scene
switch (m_deviceresources->GetcolorSpace())
{
default:
    m_toneMap->Process(commandList);
    break;
...

我发现在设置用于绘制 2D 精灵(在 3D 场景上)的描述符堆之前尝试色调映射 会导致错误:

D3D12 错误:CGraphicsCommandList::SetGraphicsRootDescriptortable:包含句柄 0x80000253a82ff205 的描述符堆 (0x0000025428203230:'DescriptorHeap') 与当前设置的描述符堆 0x0000025428203230:'DescriptorHeap' 不同。 [执行错误 #708:SET_DESCRIPTOR_table_INVALID] D3D12:为上一条消息启用 BREAK,即:[ 错误执行 #708:SET_DESCRIPTOR_table_INVALID ]

我承认这是将 HDR 和 MSAA 结合起来的第一次相当幼稚的尝试,但我担心这些功能在 DirectX 12 中可能不兼容和/或互斥。我理解为什么在 MSAA 解决期间会出现资源兼容性问题,因为我们需要为 HDR 使用浮点渲染目标。我应该注意到,如果我通过将 @H_330_3@m_msaa 布尔值设置为 false 来跳过 MSAA 代码块,我的程序将使用 HDR 正确运行和呈现。

期待任何人的建议。如果需要足够的代码或有关该程序的其他详细信息,我很乐意更新我的帖子。

解决方法

为了使用 4xMSAA 成功渲染 HDR 场景,我进行了以下修改:

  1. CreateWindowSizeDependentresources() 中,MSAA 渲染目标(和视图)使用与 HDR 渲染纹理相同的格式定义:

     // Create an MSAA render target.
     D3D12_resourcE_DESC msaaRTDesc = CD3DX12_resourcE_DESC::Tex2D(
     //m_deviceresources->GetBACkBufferFormat(),m_hdrScene->GetFormat(),// set matching format to HDR target (_R16G16B16A16_FLOAT)
     BACkBufferWidth,BACkBufferHeight,1,// This render target view has only one texture.
     1,// Use a single mipmap level
     4  // <--- Use 4x MSAA
     );
     ...
    
  2. 下一个主要变化是在 Render() 中,其中 MSAA 解析到 HDR 目标发生在 结束 HDR 场景渲染之后和之前色调映射过程:

     // Resolve the MSAA render target.
     auto BACkBuffer = m_deviceresources->GetRenderTarget();
     auto hdrBuffer = m_hdrScene->Getresource(); // HDR desTination texture
    
     {
         D3D12_resourcE_BARRIER barriers[2] =
         {
             // transition msaa texture from target to resolve source
             CD3DX12_resourcE_BARRIER::Transition(
                 m_msaaRenderTarget.Get(),D3D12_resourcE_STATE_RENDER_TARGET,D3D12_resourcE_STATE_RESOLVE_sourcE),// transition hdr texture from pixel shader resource to resolve desTination
             CD3DX12_resourcE_BARRIER::Transition(
                 hdrBuffer,D3D12_resourcE_STATE_PIXEL_SHADER_resourcE,D3D12_resourcE_STATE_RESOLVE_DEST)
         };
    
         commandList->resourceBarrier(2,barriers);
     }
    
     //commandList->ResolveSubresource(BACkBuffer,m_msaaRenderTarget.Get(),//    m_deviceresources->GetBACkBufferFormat());
    
     // resolve MSAA to the single sample 16FP resource desTination
     commandList->ResolveSubresource(hdrBuffer,m_hdrScene->GetFormat());
    
     // prepare BACkbuffer for 2D sprite drawing,typically rendered without MSAA
     {
         D3D12_resourcE_BARRIER barriers[2] =
         {
             // transition hdr texture from resolve desTination BACk to p.s resource
             CD3DX12_resourcE_BARRIER::Transition(
                 hdrBuffer,D3D12_resourcE_STATE_RESOLVE_DEST,D3D12_resourcE_STATE_PIXEL_SHADER_resourcE),// transition BACkbuffer from Present to render target (for sprite drawing after the MSAA resolvE)
             CD3DX12_resourcE_BARRIER::Transition(
                 BACkBuffer,D3D12_resourcE_STATE_PRESENT,D3D12_resourcE_STATE_RENDER_TARGET)
         };
         commandList->resourceBarrier(2,barriers);
     }
    
     ... do tone mapping
     ... do 2D sprite drawing
    

输出到传统的 1080p 显示器(无 HDR10 或 V-Sync)。 LHS 屏幕截图是没有 MSAA 的 HDR 场景,而 RHS 截图显示了 4xMSAA 对 3D 线框对象、水壶和地球模型以及三角形广告牌的平滑效果。 cat 和“Hello World”文本是在 MSAA 解析和色调映射后绘制到后台缓冲区的 2D 精灵。

再次感谢@ChuckWalbourn 为我指明了正确的方向,我期待着使用 DirectX 工具包推进我的项目。

,

ResolveSubresource 无法从 16fp 转换为 10:10:10:2 HDR10。

通常您需要:

  1. 在高动态范围(线性色彩空间)中渲染为 MSAA 浮点
  2. 将 MSAA 解析为单样本浮点。 (许多游戏选择使用高级软件抗锯齿技术作为此过程的一部分,例如 FXAA、smaA 等)
  3. 执行色调映射和 Rec.2020 色彩空间从浮点到 10:10:10:2 的转换
  4. 显示 HDR10

渲染 UI 有时发生在第 3 步之前,其他时候发生在之后。如果之前这样做过,您通常必须“放大”UI 颜色以使其脱颖而出。

有关技术细节,请参阅 SimpleMSAA DX12 和 SimpleHDR DX12 示例。

DirectX Tool Kit 包含一个 PostProcess 类,可以执行 HDR10 色调映射。见this tutorial。

大佬总结

以上是大佬教程为你收集整理的是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?全部内容,希望文章能够帮你解决是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。