Direct3D 11 为什么要区分 SRV 和 UAV?

Tri*_*ian 6 direct3d api-design direct3d11

我一直在玩 Direct3D 11,并惊讶地发现 HLSLStructuredBuffer<T>必须绑定到着色器资源视图 (SRV),而RWStructuredBuffer<T>必须绑定到统一访问视图 (UAV)。深入研究这一点,似乎所有读写着色器资源都需要 UAV,而只读资源需要 SRV。

比较UNORDERED_ACCESS_VIEW_DESCSHADER_RESOURCE_VIEW_DESC结构,UAV 或多或少是用描述 SRV 的信息子集来描述的。将 UAV 和 SRV 设置为流水线阶段的 API 也非常相似。甚至两个接口的文档看起来也像是由两个不同的技术作者解释的相同概念:

  • SRV:着色器资源视图接口指定着色器在渲染期间可以访问的子资源。
  • UAV:视图接口指定管道在渲染期间可以访问的资源部分

我不是很精通 D3D11,但在我看来,无人机的概念使 API 变得复杂而没有太多好处。SRV 和 UAV 之间的区别是为了更好地映射到硬件还是因为技术限制?或者这只是一个 API 设计决策?

mat*_*ort 4

引入这种区别可能主要是出于性能原因。仅用于读取的数据的性能特征与可用于任意写入和读取相结合的数据的性能特征有很大不同。

在大多数硬件上,支持资源的内存可能应该分配在不同类型的内存中以获得最佳性能,并具有不同的参数来确定如何缓存、如何混合/平铺、对齐等。 API 级别可以为驱动程序提供有关资源创建时和绑定时的预期用途的更多信息。