我刚刚开始学习新的 DirectX 12 API。我想在 dx12 之上编写某种渲染引擎,并且在初始化期间我应该创建描述符堆。问题在于,此时我不知道我将来会创建多少资源视图。例如,如果我想包含一些需要渲染到纹理方法的后处理效果,我必须为要渲染到的纹理创建渲染目标视图。不过,这些 RTV 的数量可能会有所不同。那么如何创建足够大的描述符堆来应对各种情况呢?
有什么建议吗?
我刚刚开始学习新的 DirectX 12 API。我想在 dx12 之上编写某种渲染引擎,并且在初始化期间我应该创建描述符堆。问题在于,此时我不知道我将来会创建多少资源视图。例如,如果我想包含一些需要渲染到纹理方法的后处理效果,我必须为要渲染到的纹理创建渲染目标视图。不过,这些 RTV 的数量可能会有所不同。那么如何创建足够大的描述符堆来应对各种情况呢?
有什么建议吗?
描述符堆的想法是有一个大的 gpu 可见的,和一堆 cpu 可见的。这是因为这SetDescriptorHeaps
是一项昂贵的操作,您不想每帧调用一次或两次以上。
您需要将大 gpu 可见堆用作环形缓冲区,为您想要准备的当前绘制或调度分配空间,并从您拥有的各种 cpu 可见描述符中复制。您可以拥有任意数量的 cpu 可见描述符堆,它或多或少只是一个常规分配包装到 d3d 对象中。
该副本没有任何生命周期保护,并且由 cpu 立即执行,请注意不要翻转可能仍在 GPU 上使用的描述符。
我在这里谈论的是 SRV 和采样器。RTV 仅对 CPU 可见,您可以随意创建任意数量的描述符堆,如果您愿意,每个描述符一个,并且不太关心 d3d 对象开销,它对运行时没有性能影响。
要记住的一件事是描述符内存几乎是无限的,我知道的大多数项目都有描述符堆,其大小最多可达 1024 个描述符。更不用说 directx 11 将为每个单独的着色器分配多达 128 个描述符。所以不用担心只需预先分配一堆描述符。但是,如果您真的想对内存的各个方面进行预算,我建议您以一种可以知道将在场景中渲染的每个网格和着色器的各个参数的方式构建引擎。