direct3d - 为什么 Direct3D 11 区分 SRV 和 UAV?

标签 direct3d api-design direct3d11

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

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

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

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

    最佳答案

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

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

    关于direct3d - 为什么 Direct3D 11 区分 SRV 和 UAV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721055/

    相关文章:

    c++ - D3D11屏幕桌面复制到ID3D11Texture2D

    flask - 如何使用外键替换为其值的API端点?

    rest - 如何处理REST API中新对象属性的引入

    javascript - Laravel API,一次POST请求中传递多个对象的正确方式

    vertex-shader - 为什么这个计算着色器比顶点着色器慢得多?

    c++ - Direct3d 和 glsl 不同大小的顶点和多维几何对象?

    c++ - 在 Direct3D 中放大和缩小

    c++ - 将 HLSL 像素着色器应用于 Win32 屏幕捕获

    c# - 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

    c++ - 将 Direct3D C++ 函数转换为 Delphi