DirectX 12 - 描述符堆

DirectX 12 - Descriptor heaps

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

有什么建议吗?

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

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

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

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

要记住的一件事是描述符内存几乎是无限的,我知道的大多数项目都有最多 1024 个描述符的描述符堆。更不用说 directx 11 会为每个单独的着色器分配多达 128 个描述符。所以不用担心预先分配一堆描述符。但是,如果您真的想对内存的各个方面进行预算,我建议您以一种可以了解将在场景中渲染的每个网格和着色器的各个参数的方式构建您的引擎。