2016-05-17 137 views
2

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

有什么建议吗?

+0

为什么你特别使用DirectX 12?你是否已经是Direct3D 11的专家? –

+0

是的,我正在学习的最后两年dx11 – Philinator

+0

您何时以及如何管理您的描述符堆在DX 12中是由您定义的。如果您觉得适合编写您自己的DirectX 11 Runtime版本,那么DirectX 12适用于你:) –

回答

2

与描述符堆的想法是有一个大的GPU可见的一个,和一堆的CPU可见的。这是因为SetDescriptorHeaps是一个代价高昂的操作,您不希望将其称为一次或两次以上的帧。

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

该副本没有任何使用寿命保护,并且由CPU立即执行,请注意不要在GPU上使用可能仍在使用的描述符。

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

+0

为渲染目标视图创建多个描述符堆时真的没有开销吗? – Philinator

+0

所以,你的意思是我应该为SRV,无人机和CBV建立一个非常大的描述符堆,并为每个RTV创建一个新的描述符堆?如果我错了,请纠正我。 – Philinator

+0

@Philinator RTV/DSV堆只供CPU使用,它们不与GPU交互,它们的编号无关紧要。 SRV/UAV/CBV和采样器的情况并非如此。在某些硬件上调用“SetDescriptorHeaps”可能代价高昂,应该不惜一切代价避免变更参数。你唯一的解决方案是在小cpu可见的堆中准备描述符,它们的计数并不重要,然后在使用点调用'CopyDescriptors'或'CopyDescriptorsSimple'到大的gpu。但我只是在这里解释我的答案:) – galop1n