【发布时间】:2017-01-15 03:14:23
【问题描述】:
我目前正在为 DirectX12 编写自己的图形框架(我已经为个人游戏引擎编写了几个 DirectX 11 框架),我目前正在 trying to copy the methods used in the recent Hitman game 进行资源绑定。
我对处理 SRV/CBV/UAV 堆的每个对象资源绑定的最佳方式感到困惑。我看过几个 GDC 演示文稿,它们似乎都掩盖了这一点。
一次只能绑定 1 个 SRV/CBV/UAV 堆,并且在命令列表中间切换当前绑定的堆可能会因强制刷新而对某些硬件的性能不利。因此,使用新描述符更新堆的最佳方法是什么?对我来说,似乎每个命令列表都会:
- 为自己获取 SRV/CBV/UAV 堆。
- 对于对象子集中的每个对象,在堆上创建描述符,指向放置在单独上传堆中的每个对象数据。
- 之后,另一个命令列表获取这个填充的描述符堆并将其绑定,然后发出与
SetGraphicsRootDescriptorTable混合的绘图调用,以便在当前描述符堆中移动。
话虽如此,网上的一些消息来源 (including another SO post) 建议使用一个大型 SRV/CBV/UAV 堆并使用 CPU 可见的堆复制到其中。我假设他们没有尝试使用异步CopyDescriptors,而是CopyBufferRegion。我尝试使用CopyBufferRegion 来更新每个对象的数据,但在我看来,D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER 和D3D12_RESOURCE_STATE_COPY_DEST 之间有如此多的转换,这似乎表现不佳。我是不是误会了什么?任何澄清将不胜感激。
【问题讨论】:
-
请务必查看MiniEngine 和DirectX Tool Kit for DirectX 12 以获取处理此问题的方法的一些示例代码。
标签: directx directx-12