我一直在玩 Direct3D 11,并惊讶地发现 HLSL StructuredBuffer<T>
必须绑定(bind)到着色器资源 View (SRV),而 RWStructuredBuffer<T>
必须绑定(bind)到统一访问 View (UAV)。深入研究,似乎所有读写着色器资源都需要 UAV,而只读资源需要 SRV。
比较UNORDERED_ACCESS_VIEW_DESC和 SHADER_RESOURCE_VIEW_DESC在结构上,无人机或多或少是用描述 SRV 的信息的子集来描述的。将 UAV 和 SRV 设置为流水线阶段的 API 也非常相似。甚至这两个接口(interface)的文档看起来都像是由两位不同的技术作者解释的同一个概念:
我对 D3D11 不是很精通,但在我看来,UAV 的概念使 API 变得复杂而没有太多好处。 SRV 和 UAV 之间的区别是为了更好地映射到硬件还是因为技术限制?或者它只是一个 API 设计决定?
最佳答案
引入这种区别可能主要是出于性能原因。仅读取访问的数据的性能特征与可任意写入和读取结合访问的数据有很大不同。
在大多数硬件上,支持资源的内存可能应该分配在不同类型的内存中以获得最佳性能,并且具有不同的参数来确定诸如缓存方式、混合/平铺、对齐方式等内容。通过将概念分开在API 级别可以为驱动程序提供有关资源在创建时和绑定(bind)时的预期用途的更多信息。
关于direct3d - 为什么 Direct3D 11 区分 SRV 和 UAV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721055/