"resource" 和 "resource view" 有什么区别?

What is the difference between a "resource" and a "resource view"?

在 Vulkan 中,内存资源是通过 "pointer-like" 元数据访问的,元数据包含在 "view" 中,它描述了应该如何解释内存资源。描述符是向着色器指定此内存所在位置的数据。"where"。

在 DirectX 12 中,资源是 "memory resource" 的缩写(参见:https://www.3dgep.com/learning-directx12-1/)。资源视图是对允许特定用途的资源的包装。例如,"shader resource view" (SRV) 允许着色器访问资源,而 "unordered access view" 类似于 SRV,只是它允许以任何顺序访问数据。

A "constant buffer view" (CBV) 允许着色器访问比平常更多 persistent/constant 的数据。 DirectX 12 文档似乎没有区分 CBV 和常量缓冲区。例如,标题为 "Constant Buffer View" 的文章说:

Constant buffers contain shader constant data. The value of them is that the data persists, and can be accessed by any GPU shader, until it is necessary to change the data.

"view" 这个词在任何地方都没有提到,就好像资源和资源视图之间没有区别一样。文档中发生这种情况的另一个地方是 resource bindings:

上的文章

The most common resources are:

  • Constant buffer views (CBVs)
  • Unordered access views (UAVs)
  • Shader resource views (SRVs)
  • Samplers

在列出公共资源时,文章提到了资源视图,就好像它们是一回事一样。

资源和 DirectX 12 中的资源视图有什么区别?

在 DirectX 中,资源是您将用来呈现的数据。例如纹理或缓冲区(如顶点缓冲区)。然后,类似于 Vulkan,您必须让图形驱动程序知道如何解释这些资源。例如,您可以将 4 字节块存储到一个缓冲区中,然后从中读取,就好像它是一个浮点值缓冲区。这就是 "views" 的用武之地。视图(在 DX12 中也称为描述符)是 pointer-like 对其指向的资源将绑定到管道的方式的描述。除了 vertex-buffers 和 index-buffers(以及某些情况下的常量缓冲区),您几乎总是必须使用视图(描述符)来绑定资源。这个过程称为资源绑定。

重要的是要知道相同的资源可以由不同的视图绑定(即描述)。例如,您可以为纹理定义一个 SRV,为它的一个 Mipmap 定义另一个 SRV,并为同一纹理定义一个 UAV,以便在计算着色器中写入它。

资源绑定是资源在D3D11/12中used/manipulated的主要过程。想一想并不难,但是太长了,无法在这里完整描述。您可以在 MS documentation.

中阅读更多相关信息