我一直在玩 Direct3D 11,并惊讶地发现 HLSLStructuredBuffer<T>
必须绑定到着色器资源视图 (SRV),而RWStructuredBuffer<T>
必须绑定到统一访问视图 (UAV)。深入研究,似乎所有读写着色器资源都需要 UAV,而只读资源需要 SRV。
比较UNORDERED_ACCESS_VIEW_DESC和SHADER_RESOURCE_VIEW_DESC结构,UAV 或多或少是用描述 SRV 的信息子集来描述的。将 UAV 和 SRV 设置为流水线阶段的 API 也非常相似。甚至这两个接口的文档看起来都像是由两位不同的技术作者解释的同一个概念:
- SRV:着色器资源视图接口指定着色器在渲染期间可以访问的子资源。
- UAV:视图接口指定渲染期间管道可以访问的资源部分
我对 D3D11 不是很精通,但在我看来,UAV 的概念使 API 变得复杂而没有太多好处。SRV 和 UAV 之间的区别是为了更好地映射到硬件还是因为技术限制?或者它只是一个 API 设计决定?