2.1.2资源视图
资源还共享一种将它们绑定到管道的通用技术。正如我们在上面看到的,有八个不同的绑定标志可用,用于标识允许绑定资源的位置。在这八个绑定位置中,有一半允许资源直接绑定到管道。其中包括顶点和索引缓冲区、常量缓冲区和流输出缓冲区(这些缓冲区类型的含义将在本章的“缓冲区资源”部分中进一步解释)。但是,其他四个绑定位置都要求在将资源绑定到管道时使用一种称为资源视图的适配器。资源视图是一个适配器对象,用于将资源连接到管道中的各个点。它在概念上提供了资源的特定“视图”。与资源的配置一样,资源视图也提供了一些可配置性。通过允许资源视图提供对资源的一些解释,可以对单个资源使用多个资源视图,以便在管道上的不同位置使用。事实上,正如我们将在本节后面看到的,资源视图也可以用于表示资源的子集。
- 顶点和索引缓冲区、常量缓冲区和流输出缓冲区可以直接绑定到管道
- 其它四个需要借助资源视图绑定到管道。所以本文介绍的就是这4种资源绑定管道时需要创建的4种资源视图。
资源 | 否需要创建视图 |
---|---|
顶点缓冲区 D3D11_BIND_VERTEX_BUFFER | 不用 |
索引缓冲区 D3D11_BIND_INDEX_BUFFERJ | 不用 |
常量缓冲区 D3D11_BIND_C0NSTANT_BUFFER | 不用 |
输入输出缓冲区 D3D11_BIND_STREAM_OUTPUT | 不用 |
纹理/缓冲区 | 渲染目标视图 Render target views |
纹理 | 深度模版视图Depth stencil views |
纹理/缓冲区 | 着色器资源视图 Shader resource views |
纹理/缓冲区 | 无序访问视图 Unordered access view |
资源视图类型
有四种不同类型的资源视图,每种视图都对应于资源可以在管道上绑定到的特定位置。这些视图决定了哪些操作可以对它们绑定到的资源执行,哪些操作不能对其执行。
下面列出了这四种类型的资源视图。
- Render target views (ID3D11RenderTargetView) - 用于输入混合
- Depth stencil views (ID3D11DepthStencilView) - 用于对输入混合的深度模版测试
- Shader resource views (ID3D11ShaderResourceView) - 用于着色器中访问资源纹理
- Unordered access view (ID3 D11UnorderedAccessView) - 随机访问,信息共享(着色器与应用)
这些资源视图中的每一个都暗示了其资源可以使用的特定语义。此外,每种类型的资源视图都提供了许多不同的配置选项,允许进一步指定如何使用资源。我们将在第3章“渲染管道”中简要讨论每种类型的资源视图的语义,以及它们的确切用法。
渲染目标视图
Render target views渲染目标视图。渲染目标视图(RTV)用于附加资源以接收渲染管道的输出。这意味着连接的资源将由管道写入,在某些情况下还将从中读取以执行混合操作。传统上,渲染目标是二维纹理,但也可以绑定其他类型的资源。渲染目标视图的各种配置选项取决于要绑定的资源类型,但包括资源的DXGI格式,以及选择要公开到管道的资源子部分的各种方法。
深度模具视图(DSV)
Depth stencil views 深度模具视图(DSV)与渲染目标视图的相似之处在于,它被附加用于接收来自渲染管道的输出。但是,它与渲染目标视图的不同之处在于,它表示深度模版缓冲区,而不是颜色渲染目标。深度模版视图资源被积极用于执行深度和模版测试。这使得附加的深度模板资源对于管道的效率非常重要。因此,为了进一步提高性能,深度模板视图还公开了一个额外的标志,以确定附加的资源是否会被写入。这允许将资源附加为深度模具缓冲区并用于深度模具测试,但同时在具有着色器资源视图(我们将检查的下一个资源视图)的着色器程序中使用。在此配置中,两个视图都是只读的,这意味着任何一个视图都不会修改资源。有了这样的使用,同一资源可以在多个地方绑定到管道,而不会有读/写危险,这允许灵活使用资源。如果需要标准使用深度模具缓冲区,第二个资源视图可以取代只读视图,以允许进行写入。
着色器资源视图(SRV)
Shader resource views 着色器资源视图(SRV)提供对管道的可编程着色器阶段的资源的读取访问。此视图对应于纹理在像素着色器中扮演的传统角色,即从着色器程序中读取和使用但未写入的数据。着色器资源视图可用于所有不同的可编程着色器阶段。
无序访问视图(UAV)
Unordered access views无序访问视图(UAV)为Direct3D11中的资源提供了一些最有趣的新用途。与着色器资源视图一样,UAV可以用于从资源中读取信息。但是,它也允许从同一着色器程序中同时写入资源。此外,输出位置不是预定义的,这允许着色器程序对资源内的任何位置执行分散写入。这提供了一种全新的资源访问类别,因为它允许以更灵活的方式使用资源。但是,需要注意的是,这种类型的视图并不适用于所有可编程着色器阶段。这些资源视图只能与像素着色器和计算着色器阶段一起使用。无序访问视图 (UAV) 是无序访问资源的视图(可包括缓冲区、纹理和纹理数组,但无需多次采样)。 使用 UAV 可通过多个线程临时进行无序读/写访问。 这意味着此资源类型可由多个线程同时读/写,且不会产生内存冲突。 这种同时访问是通过使用 Atomic Functions(原子函数)来进行的。
- 更多关于无序访问视图:https://learn.microsoft.com/zh-cn/windows/win32/direct3d12/typed-unordered-access-view-loads