Subresources(子资源)

描述资源是如何被分割成子资源,并且是如何引用一个,多个或者部分子资源。

如果一个资源包含一个buffer,那么它简单地包含一个索引为0的子资源。
如果资源包含纹理(或者纹理数组),那么引用子资源是非常复杂的。

一些API访问一个完整的资源(比如ID3D12GraphicsCommandList::CopyResouce方法),
其它访问资源的一部分(例如ID3D12Resouce::ReadFromSubresource方法)。
访问资源的一部分的方法使用一个view description(例如D3D12_TEX2D_ARRAY_SRV结构体)去描述子资源去访问。

子资源API如下

https://docs.microsoft.com/en-us/windows/win32/direct3d12/subresources#subresource-apis

Subresource Indexing

image

Mip Slice

image

Array slice

给定纹理的数组,每个纹理都有mipmaps,一个array slice包含一个纹理,还有所有它的mip levels,如下图所示。
image

Plane slice

通常地平面格式不用来存储RGBA数据,但是在一种情况下它是,一个平面可以表示红色图像,
一个表示绿色,一个表示蓝色图像。一个平面不是必须的一种红色,两个或多个颜色可以合并成一个平面。更典型的平面格式被用于子采样YCbCr和Depth-Stencil数据。
Depth-Stencil是唯一的格式,完全地支持mipmaps,arrays,还有多个planes(经常plane 0是Depth,plane 1是Stencil)。

image

子采样YCbCr支持数组,并且有平面,但是不支持mipmaps。YCbCr图像有两个平面,
一个是luminance(Y),人类眼睛最敏感的,还有一个是chrominance(Cb和Cr,交错的)人类眼睛稍微不敏感。这个格式开启了chrominance的压缩,目的是为了压缩图像,从而不影响luminance,并且是一个通用的视频压缩格式,对于那个理由。

如下展示了NV12格式,chrominance已经被压缩到luminance分辨率的一半,每个平面的宽度是相同的,并且chrominance平面是luminance平面的高度的一半。平面可以作为子资源索引在相同的方式,就像上面的Depth-Stencil例子一样。

平面格式存在于Direct3D 11,但是独立的平面不能被独立地访问,对于拷贝和映射操作来说。
Direct3D 12,每个平面接收它自己的subresouce ID。比较如下的两个方法,去计算subresouce ID。
image

Direct3D 11

inline UINT D3D11CalcSubresouece(UINT MipSlice, UINT ArraySlice, UINT MipLevels)
{
	return MipSlice + (ArraySlice * MipLevels);
}

Direct3D 12

inline UINT D3D12CalcCSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize)
{
	return MipSlice + (ArraySlice * MipLevels) + (PlanceSlice * MipLevels * ArraySize);
}