2.1.2创建资源视图
下面列出了这四种类型的资源视图。
- Render target views (ID3D11RenderTargetView) - 用于输入混合
- Depth stencil views (ID3D11DepthStencilView) - 用于对输入混合的深度模版测试
- Shader resource views (ID3D11ShaderResourceView) - 用于着色器中访问资源纹理
- Unordered access view (ID3 D11UnorderedAccessView) - 随机访问,信息共享(着色器与应用)
创建资源视图的过程与我们所看到的创建资源的过程有些相似。ID3D11Device还负责创建资源视图,并为每种类型提供一种创建方法。所有创建方法都遵循相同的模式,由应用程序提供三个不同的参数.
HRESULT CreateRenderTargetView(
[in] ID3D11Resource *pResource,
[in, optional] const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,
[out, optional] ID3D11RenderTargetView **ppRTView
);
HRESULT CreateShaderResourceView(
[in] ID3D11Resource *pResource,
[in, optional] const D3D11_SHADER_RESOURCE_VIEW_DESC *pDesc,
[out, optional] ID3D11ShaderResourceView **ppSRView
);
HRESULT CreateDepthStencilView(
[in] ID3D11Resource *pResource,
[in, optional] const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc,
[out, optional] ID3D11DepthStencilView **ppDepthStencilView
);
HRESULT CreateUnorderedAccessView(
[in] ID3D11Resource *pResource,
[in, optional] const D3D11_UNORDERED_ACCESS_VIEW_DESC *pDesc,
[out, optional] ID3D11UnorderedAccessView **ppUAView
);
所有这些创建方法的第一个参数是指向资源视图将表示的资源的指针。第二个参数是指向描述结构的指针,其中包含该特定类型的资源视图的所有可用选项。第三个也是最后一个参数是指向相应资源视图类型的指针的指针,如果创建调用成功,新创建的资源视图将存储在该类型中。第二个参数是关于以我们希望的方式配置资源视图的最有趣的参数。四种资源视图类型中的每一种都使用一个独特的描述结构,公开了它们各自的独特属性。我们将仔细研究这些结构中的每一个,以了解开发人员可以使用哪些选项。
渲染目标视图选项
我们首先仔细查看用于创建渲染目标视图的可用选项。图2.3显示了必须填写并传递给创建方法ID3DllDevice::CreateRenderTargetView()的结构。
如图2.3所示,该结构使用几个正常成员变量,然后是其它结构的公用体。这允许所有不同的资源类型使用相同的描述结构,同时仍然为每个资源类型提供唯一的属性。format参数指定读取资源时将转换为的数据格式。在某些情况下,这允许在运行时通过所使用的资源视图中提供的格式来确定资源的格式。这对某些应用程序(如视频格式转换)很有帮助。这要求使用与此结构中指定的所需视图格式兼容的格式创建资源。
第二个变量ViewDimension指示哪种类型的资源将与此资源视图绑定。此变量的选择决定了将使用哪种统一结构来创建资源视图。这就是设备知道要解释统一结构的哪个版本的方式,这允许将相同的创建功能和输入数据结构用于所有各种资源类型,同时仍将结构的大小保持在最小。所有的“联合”结构都用于指定要在资源视图中提供的资源部分。当然,由于每种类型的资源使用不同的内存布局和不同的选项,因此为每种资源类型提供不同的结构是有意义的。由于我们还没有详细介绍各种资源类型(或它们的各种配置),我们必须推迟对这些属性的详细研究。当我们在本章后面研究各种资源类型及其布局概念时,我们将重新审视这些结构,看看它们如何提供适当的子资源选择。
深度模版视图选项
深度模版视图选项结构的描述结构与渲染目标视图的描述结构相似。
如上所述,此资源视图类型还需要指定DXGI数据格式和视图维度属性。一个感兴趣的点是,可用于深度模版资源视图的不同资源类型的数量略小于可用于渲染目标视图的资源类型。这是由于对深度模具资源执行的操作的特定性质造成的。
此结构的另一个显著特征是添加了Flags参数。这允许标志的位或组合,用于指定资源的深度或模具部分是否将仅读取到此资源视图的管道。这允许深度模具资源的多个视图同时绑定到检查其内容所需的算法的管道。
着色器资源视图选项
着色器资源视图也遵循我们在以前的描述结构中已经看到的相同基本公式。格式和视图维度的操作方式与我们已经检查过的资源视图相同。但是,您会注意到unioned结构中提供了三种新的资源类型。图2.5显示了这种结构。
此处列出的新资源类型包括TextureCube、TextureCubeArray和BufferEx。纹理立方体允许将Texture2D数组资源重新解释为立方体纹理,这允许HLSL程序使用专门的内在函数对纹理进行采样。TextureCubeArray也是如此,它基本上是一个具有相同类型的多维数据集资源解释的数组。我们稍后将在“纹理资源”部分更详细地探讨这意味着什么,但它提供了一个很好的例子,说明资源视图能够获取资源的数据,并为特定目的提供不同的“视图”。
着色器资源视图可用的最后一种新资源类型是BufferEx类型。这本质上是一种允许将缓冲区解释为原始缓冲区的结构。这为HLSL程序提供了在着色器程序本身中进行结构解释的自由度。这也将在本章的“缓冲资源”部分进行更详细的讨论。
无序访问视图选项
与着色器资源视图相比,无序访问视图提供的可用资源类型较少。然而,它确实提供了几个用于配置缓冲区资源的新选项。正如我们稍后在“缓冲区资源”一节中所看到的,有一些独特类型的缓冲区可以创建用于特殊用途。在这个描述结构中,有一些额外的标志用于使用缓冲区作为附加和消耗缓冲区,还有另一个标志用于指示缓冲区对象中有一个内置计数器。