Direct3D 11 中的资源简介
资源是场景的构建基块。 它们包含 Direct3D 用于解释和呈现场景的大多数数据。 资源是内存中可由 Direct3D 管道访问的区域。 资源包含以下类型的数据:几何图形、纹理、着色器数据。 本主题介绍 Direct3D 资源,例如缓冲区和纹理。
可以创建强类型或无类型的资源;可以控制资源是否同时具有读取和写入访问权限;可以让资源仅可供 CPU 和/或 GPU 访问。 每个管道阶段最多可以有 128 个活动资源。
Direct3D 保证对超出边界访问的任何资源返回零。
Direct3D 资源的生命周期为:
- 使用 ID3D11Device 接口的 create 方法之一创建资源。
- 使用上下文和 ID3D11DeviceContext 接口的集方法之一将资源绑定到管道。
- 通过调用资源接口的 Release 方法解除分配资源。
本节包含下列主题:
强与弱类型化
可通过两种方式完全指定资源的布局(或内存占用量):
- 类型化 - 在创建资源时完全指定类型。
- 无类型 - 在资源绑定到管道时完全指定类型。
创建完全类型化的资源会将资源限制为创建时采用的格式。 这使运行时能够优化访问,尤其是在创建的资源带有指示其无法由应用程序映射的标志时。 除非使用 D3D10_DDI_BIND_PRESENT 标志创建资源,否则无法使用视图机制重新解释使用特定类型创建的资源。 如果设置了D3D10_DDI_BIND_PRESENT,则可以使用相应系列的任何完全类型化成员在这些资源上创建呈现目标或着色器资源视图,即使原始资源创建为完全类型化也是如此。
在类型较少的资源中,首次创建资源时数据类型未知。 应用程序必须从可用类型中进行选择, (查看 DXGI_FORMAT) 格式。 你必须指定要分配的内存大小以及运行时是否需要在 mipmap 中生成子纹理。 但是,确切的数据格式 (内存是否将被解释为整数、浮点值、无符号整数等,) 直到资源绑定到具有 资源视图的管道。 由于纹理格式在纹理绑定到管道之前仍保持灵活性,因此资源被称为弱类型化的存储。 弱类型存储的优点是,只要组件数和每个组件的位计数在两种格式中相同,就可以以另一种格式重复使用或重新解释它。
单个资源可绑定到多个管道阶段,前提是每个资源具有唯一视图,这样可以完全限定每个位置的格式。 例如,使用 DXGI_FORMAT_R32G32B32A32_TYPELESS 格式创建的资源可以同时用作管道中不同位置的DXGI_FORMAT_R32G32B32A32_FLOAT和DXGI_FORMAT_R32G32B32A32_UINT。
资源视图
资源可以以常规用途内存格式存储,以便可以由多个管道阶段共享。 管道阶段使用视图解释资源数据。 资源视图在概念上类似于强制转换资源数据,以便它可以在特定上下文中使用。
视图可与无类型资源一起使用。 也就是说,可以在编译时创建资源,并在资源绑定到管道时声明数据类型。 为无类型资源创建的视图始终具有每个组件相同的位数;解释数据的方式取决于指定的格式。 指定的格式必须与创建资源时使用的无类型格式来自同一系列。 例如,使用 R8G8B8A8_TYPELESS 格式创建的资源不能被视为R32_FLOAT资源,即使这两种格式在内存中的大小可能相同。
视图还公开其他功能,例如读取着色器中的背面深度/模具图面、在单个通道中生成动态立方体贴图以及同时呈现到卷的多个切片。
资源接口 | 说明 |
---|---|
ID3D11DepthStencilView | 在深度模具测试期间访问纹理资源。 |
ID3D11RenderTargetView | 访问用作呈现目标的纹理资源。 |
ID3D11ShaderResourceView | 访问着色器资源,例如常量缓冲区、纹理缓冲区、纹理或采样器。 |
ID3D11UnorderedAccessView | 使用像素着色器或计算着色器访问无序资源。 |
缓冲区的原始视图
可以将原始缓冲区(也可以称为 字节地址缓冲区)视为需要原始访问的一包位,即可以通过一到四个 32 位无类型地址值的区块方便地访问的缓冲区。 指示希望原始访问缓冲区 (,或者在调用以下方法之一创建缓冲区视图时,) 缓冲区的原始视图:
- 若要创建着色器资源视图 (SRV) 缓冲区,请使用标志D3D11_BUFFEREX_SRV_FLAG_RAW调用 ID3D11Device::CreateShaderResourceView。 可以在 D3D11_BUFFEREX_SRV 结构的 Flags 成员中指定此标志。 在 id3D11Device::CreateShaderResourceView 的 pDesc 参数指向的 D3D11_SHADER_RESOURCE_VIEW_DESC 结构的 BufferEx成员中设置D3D11_BUFFEREX_SRV。 还可以在 D3D11_SHADER_RESOURCE_VIEW_DESC 的 ViewDimension 成员中设置 D3D11_SRV_DIMENSION_BUFFEREX 值,以指示 SRV 是原始视图。
- 若要 (UAV) 缓冲区创建无序访问视图,请使用标志D3D11_BUFFER_UAV_FLAG_RAW调用 ID3D11Device::CreateUnorderedAccessView。 可以在 D3D11_BUFFER_UAV 结构的 Flags 成员中指定此标志。 在 id3D11Device::CreateUnorderedAccessView 的 pDesc 参数指向的 D3D11_UNORDERED_ACCESS_VIEW_DESC 结构的 Buffer 成员中设置D3D11_BUFFER_UAV。 还可以在 D3D11_UNORDERED_ACCESS_VIEW_DESC 的 ViewDimension 成员中设置 D3D11_UAV_DIMENSION_BUFFER 值,以指示 UAV 是原始视图。
使用原始缓冲区时,可以使用 HLSL ByteAddressBuffer 和 RWByteAddressBuffer 对象类型。
若要创建缓冲区的原始视图,必须先使用 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 标志调用 ID3D11Device::CreateBuffer 以创建基础缓冲区资源。 可以在 id3D11Device::CreateBuffer 的 pDesc 参数指向的 D3D11_BUFFER_DESC 结构的 MiscFlags 成员中指定此标志。 不能将 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 标志与 D3D11_RESOURCE_MISC_BUFFER_STRUCTURED合并。 此外,如果在 D3D11_BUFFER_DESC 的 BindFlags 中指定D3D11_BIND_CONSTANT_BUFFER,则也不能在 MiscFlags 中指定D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS。 这不仅仅是原始视图的限制,因为常量缓冲区已有一个约束,即它们不能与任何其他视图组合。
除了上述无效情况外,使用 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 创建缓冲区时,在功能上不受限制,也不设置 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS。 也就是说,可以通过 Direct3D 可能采用多种方式将此类缓冲区用于非原始访问。 如果指定 D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS 标志,则只会增加可用功能。
相关主题