首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DirectX 12桌面应用程序中能够将HDR和MSAA结合起来吗?

在DirectX 12桌面应用程序中能够将HDR和MSAA结合起来吗?
EN

Stack Overflow用户
提问于 2021-03-27 11:17:16
回答 2查看 377关注 0票数 0

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

D3D12错误: ID3D12CommandList::ResolveSubresource :指定格式与源resource.Format : R10G10B10A2_UNORM、源资源格式: R16G16B16A16_FLOAT RESOURCE_MANIPULATION错误#878: RESOLVESUBRESOURCE_INVALID_FORMAT不兼容

我正在使用HDR示例代码作为SDR显示监视器,因此需要应用声调映射。关于发出调用的顺序,在尝试解决MSAA呈现目标之前,我先调用HDR结束:

代码语言:javascript
复制
// 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解析块之后,我将音调映射语句放置如下:

代码语言:javascript
复制
// 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场景上)之前尝试使用音调映射会导致错误:

错误: CGraphicsCommandList::SetGraphicsRootDescriptorTable:包含句柄0x80000253a82ff205的描述符堆(0x0000025428203230:'DescriptorHeap')不同于当前设置描述符堆0x0000025428203540:'EffectTextureFactory‘。执行错误#708: SET_DESCRIPTOR_TABLE_INVALID D3D12:为上一条消息启用的BREAK,即: ERROR EXECUTION #708: SET_DESCRIPTOR_TABLE_INVALID

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

期待着任何人可能得到的任何建议。如果需要足够的代码或有关程序的其他细节,我很乐意更新我的帖子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-27 19:14:43

ResolveSubresource无法完成从16 do到10:10:10:2 HDR10的转换。

一般来说,你需要:

  1. 在高动态范围内呈现给MSAA浮点(线性颜色空间)
  2. 将MSAA解析为单样本浮点。(许多游戏选择使用先进的软件反别名技术作为此过程的一部分,如FXAA、SMAA等)
  3. 执行声调图和Rec.2020彩色空间从浮点到10:10:10:2的转换
  4. 显示HDR10

呈现UI有时发生在步骤3之前,而其他时候则发生在步骤3之后。如果以前这样做了,你通常必须‘放大’UI的颜色,使他们脱颖而出。

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

DirectX工具包包括一个可以执行HDR10音调映射的PostProcess类。见本教程

票数 0
EN

Stack Overflow用户

发布于 2021-03-29 08:02:06

为了用4xMSAA成功地呈现HDR场景,我做了以下修改:

  1. CreateWindowSizeDependentResources(),中,MSAA呈现目标(和视图)定义的格式与HDR呈现纹理相同: //创建MSAA呈现目标。D3D12_RESOURCE_DESC msaaRTDesc = CD3DX12_RESOURCE_DESC::Tex2D( //m_deviceResources->GetBackBufferFormat(),m_hdrScene->GetFormat(),// set匹配格式与HDR目标(_R16G16B16A16_FLOAT) backBufferWidth,backBufferHeight,1,//此呈现目标视图只有一个纹理。1,//使用单个mipmap级别4 // <-使用4xMSAA );
  2. 下一个主要更改是在呈现()中,其中MSAA解析HDR目标发生在结束HDR场景渲染之后和音调映射过程之前: //解析MSAA呈现目标。auto backBuffer = m_deviceResources->GetRenderTarget();auto hdrBuffer =hdrBuffer>GetResource();// HDR目标纹理{ D3D12_RESOURCE_BARRIER barriers2 ={ //转换msaa纹理从目标到解析源CD3DX12_RESOURCE_BARRIER::Transition( m_msaaRenderTarget.Get(),D3D12_RESOURCE_STATE_RENDER_TARGET,D3D12_RESOURCE_STATE_RESOLVE_SOURCE),//从像素着色器资源转换hdr纹理以解析目标CD3DX12_RESOURCE_BARRIER::Transition( hdrBuffer,D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,D3D12_RESOURCE_STATE_RESOLVE_DEST) };命令16FP >ResourceBarrier(2,屏障);} //commandList->ResolveSubresource(backBuffer,0,m_msaaRenderTarget.Get(),0,// m_deviceResources->GetBackBufferFormat();//解决MSAA到单个示例16 to资源目的地命令>ResolveSubresource(hdrBuffer,0,m_msaaRenderTarget.Get(),0,m_hdrScene->GetFormat());//准备2D sprite绘图的后台缓冲区,通常不使用MSAA { D3D12_RESOURCE_BARRIER barriers2 ={ //转换hdr纹理从解析目标返回到p.s资源CD3DX12_RESOURCE_BARRIER::Transition( hdrBuffer、D3D12_RESOURCE_STATE_RESOLVE_DEST、D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),//从当前转换为呈现目标(用于在MSAA解析后绘制sprite ) CD3DX12_RESOURCE_BARRIER::Transition( backBuffer,D3D12_RESOURCE_STATE_PRESENT,D3D12_RESOURCE_STATE_RENDER_TARGET) };.>资源壁垒(2,障碍);做音色映射..。做二维精灵画

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

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

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

https://stackoverflow.com/questions/66830705

复制
相关文章

相似问题

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