Resource:ID3D11Resource跟ID3D11View
概述:ID3D11Resource 作为一个基类,它的子都是用于对渲染管道需要用到的数据进行封装和描述的。ID3D11View 只是对ID3D11Resource进一步的装饰。
资源的介绍:
资源分为缓冲资源和纹理资源
ID3D11Resource -----> ID3D11Buffer (缓冲资源)
ID3D11Resource -----> ID3D11Texture1D,ID3D11Texture2D,ID3D11Texture3D (纹理资源)
资源的属性:
Usage :资源的使用方式,例如纹理资源,是作为texture还是render target
format :数据的格式。主要是存储的格式,例如像素的存储格式之类。
pool :存放资源的存储器类型,以及管理方式。
type :资源类型。
内存划分:
1.System Memory :系统内存
2.Local Video Memory :显存,GPU会有比较高的读写能力,但是CPU读写的话效率比较低。
3.Nonlocal Video Memory (AGP/PCIE):这个是主板上的一块内存,这块内存GPU和CPU读和写的效率都比较高。
策略:如果只是CPU用的就放到系统内存,如果是GPU用的就放到LVM,如果是两者交互比较多的,就放到NVM中。此外,在使用的优先级上,GPU先使用显存,CPU先使用AGP/PCIE(效率比系统内存高)。
ID3D11Resource :它不能被直接使用,一般使用它的子。
GetEvictionPriority :的资源获取驱逐优先。
SetEvictionPriority :将驱逐优先的资源。
- DXGI_RESOURCE_PRIORITY_MINIMUM // 最小优先级
- DXGI_RESOURCE_PRIORITY_LOW
- DXGI_RESOURCE_PRIORITY_NORMAL
- DXGI_RESOURCE_PRIORITY_HIGH
- DXGI_RESOURCE_PRIORITY_MAXIMUM // 最大优先级
这两个方法用于处理,当存储空间不够的时候优先释放那些内存的,主要用于对性能的优化。这里不清楚的是,不知道是先驱逐优先级高的,还是优先级低的。
getType :获取的资源的类型,一看应该很明白哦。
- typedef enum D3D11_RESOURCE_DIMENSION {
- D3D11_RESOURCE_DIMENSION_UNKNOWN = 0,
- D3D11_RESOURCE_DIMENSION_BUFFER = 1,
- D3D11_RESOURCE_DIMENSION_TEXTURE1D = 2,
- D3D11_RESOURCE_DIMENSION_TEXTURE2D = 3,
- D3D11_RESOURCE_DIMENSION_TEXTURE3D = 4
- } D3D11_RESOURCE_DIMENSION;
ID3D11Buffer :缓冲区接口访问缓冲区的资源,即非结构化的内存(这里提到非结构化内存是因为还有结构化内存)。缓冲区通常存储顶点或索引数据。
ID3D11Texture1D,ID3D11Texture2D,ID3D11Texture3D : 纹理接口访问 纹理数据,这是结构化的内存。
上述这些接口都只有一个方法:GetDesc 用来获取描述信息,这说明它们自身的内容并不是有自己提供接口给外部使用,而是借组第三方接口来进行使用。从某种意义上来讲,在我们使用的时候,我们只需把它们当中一个普通的变量即可,真正需要关注的是使用它们的类。
ID3D11View :一个ID3D11View的子类可以把渲染过程中,需要用到的一部分资源绑定到渲染管道。
- void GetResource(
- [out] ID3D11Resource **ppResource
- );
这是它的唯一方法,可以获取与之对应的资源对象。
ID3D11DepthStencilView :访问数据在纹理深度模版。
ID3D11RenderTargetView :访问数据的渲染目标。
ID3D11ShaderResourceView :在着色器资源的访问数据。
ID3D11UnorderedAccessView :在一个无序的资源访问数据。
- void GetDesc(
- [out] D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc
- );
与ID3D11Resource的子类相似,ID3D11View 的子类也只有一个获取状态描述的方法。为什么会出现这样的情况呢?主要是因为这些资源对象,主要是作为一种介质传入给渲染管道,然后被众多着色器使用,使用它们的数据主要是HLSL。