6

我一直在玩 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 不是很精通,但在我看来,UAV 的概念使 API 变得复杂而没有太多好处。SRV 和 UAV 之间的区别是为了更好地映射到硬件还是因为技术限制?或者它只是一个 API 设计决定?

4

1 回答 1

2

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

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

于 2014-03-31T20:10:31.633 回答