使用 DirectX 12 的 DirectX 工具包,我能够成功编译和运行各个 MSAA 和 HDR 教程示例。但是,当我将 MSAA 和 HDR 组件的相关代码组合到一个Game.cpp文件中时,编译失败并显示调试层消息:
D3D12 错误:ID3D12CommandList::ResolveSubresource:指定的格式与源资源不兼容。格式:R10G10B10A2_UNORM,源资源格式:R16G16B16A16_FLOAT [RESOURCE_MANIPULATION ERROR #878:RESOLVESUBRESOURCE_INVALID_FORMAT]
我正在为 SDR 显示监视器使用 HDR 示例代码,因此需要应用色调映射。关于调用的顺序,我在尝试解析 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') 与当前设置的描述符堆 0x0000025428203540:'EffectTextureFactory' 不同。[执行错误#708:SET_DESCRIPTOR_TABLE_INVALID] D3D12:为上一条消息启用了BREAK,即:[错误执行#708:SET_DESCRIPTOR_TABLE_INVALID]
我承认这是第一次尝试将 HDR 和 MSAA 结合起来相当天真,但我担心这些功能在 DirectX 12 中可能不兼容和/或相互排斥。我理解为什么在 MSAA 解决过程中会出现资源兼容性问题,因为我们需要为 HDR 使用浮点渲染目标。我应该注意,如果我通过将m_msaa boolean 设置为false来跳过 MSAA 代码块,我的程序将使用 HDR 正确运行和渲染。
期待任何人可能有的任何建议。如果需要足够的代码或有关程序的其他详细信息,我很乐意更新我的帖子。