是否可以在 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 使用浮点渲染目标。我应该注意到,如果我通过将 m_msaa 布尔值设置为 false 来跳过 MSAA 代码块,我的程序将使用 HDR 正确运行和呈现。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)