DirectX 12 - 描述符堆

Phi*_*tor 4 c++ directx directx-12

我刚刚开始学习新的 DirectX 12 API。我想在 dx12 之上编写一种渲染引擎,并且在初始化期间我应该创建描述符堆。问题在于,此时我不知道我将来会创建多少资源视图。例如,如果我想包含一些需要渲染到纹理方法的后期处理效果,我必须为我渲染的纹理创建渲染目标视图。不过,这些 RTV 的数量可能会有所不同。那么如何创建足够大的描述符堆以应对各种情况呢?

有什么建议吗?

gal*_*p1n 5

描述符堆的想法是让一个大的 gpu 可见,和一堆 cpu 可见。这是因为SetDescriptorHeaps是一个代价高昂的操作,您不想在一帧中多次调用它。

您需要使用大 gpu 可见堆作为环形缓冲区,为要准备的当前绘制或调度分配空间,并从您拥有的各种 cpu 可见描述符中复制。您可以拥有任意数量的 cpu 可见描述符堆,它或多或少只是常规分配包装到 d3d 对象中。

副本没有任何生命周期保护,由 cpu 立即执行,注意不要翻转可能仍在 GPU 上使用的描述符。

我在这里谈论的是 SRV 和采样器。RTV 仅对 CPU 可见,您可以根据需要自由创建任意数量的描述符堆,如果您愿意,每个描述符一个,并且不太关心 d3d 对象开销,它对运行时没有性能影响。