大佬教程收集整理的这篇文章主要介绍了是否可以在 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 场景,我进行了以下修改:
在 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
);
...
下一个主要变化是在 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。
通常您需要:
渲染 UI 有时发生在第 3 步之前,其他时候发生在之后。如果之前这样做过,您通常必须“放大”UI 颜色以使其脱颖而出。
有关技术细节,请参阅 SimpleMSAA DX12 和 SimpleHDR DX12 示例。
DirectX Tool Kit 包含一个 PostProcess
类,可以执行 HDR10 色调映射。见this tutorial。
以上是大佬教程为你收集整理的是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?全部内容,希望文章能够帮你解决是否可以在 DirectX 12 桌面应用程序中将 HDR 与 MSAA 结合使用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。