サブリソースSubresources

リソースをサブリソースに分割する方法と、1 つのサブリソース、複数のサブリソース、またはサブリソースのスライスを参照する方法について説明します。Describes how a resource is divided into subresources, and how to reference a single, multiple or slice of subresources.

サブリソースの例Example subresources

1 つのリソースの内容がバッファー 1 つである場合は、サブリソースが 1 つあることになり、そのインデックスは 0 です。If a resource contains a buffer, then it simply contains one subresource with an index of 0. そのリソースの内容がテクスチャ (またはテクスチャ配列) である場合は、そのサブリソースの参照はより複雑になります。If the resource contains a texture (or texture array), then referencing the subresources is more complex.

API の中には、リソース全体にアクセスするものもあれば (たとえば ID3D12GraphicsCommandList::CopyResource メソッド)、リソースの一部分にアクセスするものもあります (たとえば ID3D12Resource::ReadFromSubresource メソッド)。Some APIs access an entire resource (such as the ID3D12GraphicsCommandList::CopyResource method), others access a portion of a resource (for example the ID3D12Resource::ReadFromSubresource method). リソースの一部分にアクセスするメソッドは一般的に、ビュー記述 (たとえば D3D12_TEX2D_ARRAY_SRV 構造体) を使用してアクセス対象のサブリソースを指定します。The methods that access a portion of a resource generally use a view description (such as the D3D12_TEX2D_ARRAY_SRV structure) to specify the subresources to access. すべての一覧については、「サブリソースの API」セクションを参照してください。Refer to the Subresource APIs section for a complete list.

サブリソースのインデックスSubresource indexing

特定のサブリソースをインデックスで指定するために、各配列エントリにインデックスを付けるときに、最初に MIP レベルにインデックスが付けられます。To index a particular subresource, the mip levels are indexed first as each array entry is indexed.

サブリソースのインデックス

MIP スライスMip slice

次の画像に示すように、1 つの MIP スライスには、配列内の同じ MIP マップ レベルのテクスチャがすべて含まれています。A mip slice includes one mipmap level for every texture in an array, as shown in the following image.

サブリソースの MIP スライス

配列スライスArray slice

次の画像に示すように、あるテクスチャ配列で、各テクスチャに MIP マップがある場合に、1 つの配列スライスには 1 つのテクスチャとそのすべての MIP レベルが含まれています。Given an array of textures, each texture with mipmaps, an array slice includes one texture and all of its mip levels, as shown in the following image.

サブリソースの配列スライス

プレーン スライスPlane slice

一般的に、平面形式が RGBA データの格納に使用されることはありませんが、使用される場合は (おそらく 24bpp RGB データ)、プレーンの 1 つが赤色の画像、1 つが緑色の画像、1 つが青色の画像を表します。Typically planar formats are not used to store RGBA data, but in the cases where it is (perhaps 24bpp RGB data), one plane could represent the red image, one the green, and one the blue image. 1 つのプレーンが 1 色である必要はなく、2 色以上を組み合わせて 1 つのプレーンにすることもできます。One plane though is not necessarily one color, two or more colors could be combined into one plane. 平面データがより一般的に使用されるのは、サブサンプリングされた YCbCr と深度ステンシル データです。More typically planar data is used for sub-sampled YCbCr and Depth-Stencil data. 深度ステンシルは、MIP マップ、配列、複数プレーンを完全にサポートする唯一の形式です (多くの場合はプレーン 0 が深度、プレーン 1 がステンシル)。Depth-Stencil is the only format that fully supports mipmaps, arrays, and multiple planes (often plane 0 for Depth and plane 1 for Stencil).

2 つの深度ステンシル画像の配列があり、それぞれに 3 つの MIP レベルがある場合に、この配列でのサブリソースのインデックスは次のようになります。The subresource indexing for an array of two Depth-Stencil images, each with three mip levels, is shown below.

深度ステンシルのインデックス

サブサンプリングされた YCbCr では配列がサポートされ、プレーンがありますが、MIP マップはサポートされません。Sub-sampled YCbCr supports arrays and has planes, but does not support mipmaps. YCbCr 画像には 2 つのプレーンがあります。1 つは輝度 (Y) つまり人間の目が最も敏感に認識する成分であり、もう 1 つはクロミナンス (Cb と Cr の両方がインターリーブ) つまり人間の目がそれほど敏感には認識しない成分です。YCbCr images have two planes, one for the luminance (Y) that the human eye is most sensitive to, and one for the chrominance (both Cb, and Cr, interleaved) which the human eye is less sensitive to. この形式では、輝度に影響を与えることなくクロミナンスを圧縮することによって画像を圧縮することができ、そのような理由からビデオ圧縮形式としてよく使われていますが、静止画像の圧縮にも使用されています。This format enables compression of the chrominance values in order to compress an image without affecting the luminance, and is a common video compression format for that reason, although it is used to compress still images. 次に示す画像は、NV12 形式を表しています。クロミナンスが圧縮されて輝度の解像度の 4 分の 1 になっていることに注目してください。つまり、各プレーンの幅は同一ですが、クロミナンスのプレーンの高さは輝度のプレーンの半分です。The image below shows the NV12 format, noting the chrominance has been compressed to one quarter of the resolution of the luminance, meaning the width of each plane is identical, and the chrominance plane is half the height of the luminance plane. これらのプレーンにサブリソースとしてインデックスを付ける方法は、上記の深度ステンシルの例と同じです。The planes would be indexed as subresources in an identical way to the Depth-Stencil example above.

NV12 形式

平面形式は Direct3D 11 にも存在しますが、コピーやマッピングなどの操作のために個々のプレーンを個別に指定することはできません。Planar formats existed in Direct3D 11, but individual planes could not be addressed individually, say for copy or mapping operations. これは Direct3D 12 で変更され、各プレーンに専用のサブリソース ID が付与されるようになりました。This was changed in Direct3D 12 so that each plane received its own subresource ID. サブリソース ID の計算について、次の 2 つの方法を比較します。Compare the following two methods for calculating the subresource ID.

Direct3D 11Direct3D 11

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

Direct3D 12Direct3D 12

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

ほとんどのハードウェアは、プレーン N 用のメモリが常にプレーン N-1 の直後に確保されると想定しています。Most hardware assumes that the memory for plane N is always immediately allocated after plane N-1.

アプリでのサブリソースの使用に代わる方法として、プレーンごとにまったく別のリソースを割り当てることもできます。An alternative to using subresources is that an app could allocate a completely separate resource per plane. この場合は、そのデータが平面形式であることをアプリケーションが理解して、複数のリソースを使用してそのデータを表します。In this case, the application understands the data is planar and uses multiple resources to represent it.

複数のサブリソースMultiple subresources

シェーダー リソース ビューでは、次の画像に示すように任意の四角形領域内のサブリソースを選択することができます。これには、前述のスライスの 1 つを使用するとともに、ビュー構造内のフィールドを適切に使用します (たとえば D3D12_TEX2D_ARRAY_SRV)。A shader-resource view can select any rectangular region of subresources, using one of the slices described above and judicious use of fields in the view structures (such as D3D12_TEX2D_ARRAY_SRV), as shown in the image.

複数のサブリソースの選択

レンダー ターゲット ビューで使用できるのは、サブリソースまたは MIP スライス 1 つだけです。複数の MIP スライスからサブリソースを選択することはできません。A render-target view can only use a single subresource or mip slice and cannot include subresources from more than one mip slice. つまり、1 つのレンダー ターゲット ビュー内のテクスチャはすべて、同じサイズでなければなりません。That is, every texture in a render-target view must be the same size. シェーダー リソース ビューでは、この画像に示すように、任意の四角形領域内のサブリソースを選択できます。A shader-resource view can select any rectangular region of subresources, as shown in the image.

サブリソースの APISubresource APIs

次の API でサブリソースを参照し、サブリソースを扱います。The following APIs reference and work with subresources:

列挙型:Enumerations:

以下の構造体の中に PlaneSlice インデックスがあり、ほとんどの中に MipSlice インデックスがあります。The following structures contain PlaneSlice indexes, most contain MipSlice indexes.

以下の構造体の中に ArraySlice インデックスがあり、ほとんどの中に MipSlice インデックスがあります。The following structures contain ArraySlice indexes, most contain MipSlice indexes.

以下の構造体の中には MipSlice インデックスがありますが、ArraySlice インデックスと PlaneSlice インデックスはありません。The following structures contain MipSlice indexes, but neither ArraySlice nor PlaneSlice indexes.

以下の構造体もサブリソースを参照します。The following structures also reference subresources:

メソッド:Methods:

テクスチャは D3D12_RESOURCE_STATE_COMMON 状態でなければ WriteToSubresourceReadFromSubresource による CPU アクセスが合法にはなりませんが、バッファーはそうではありません。Textures must be in the D3D12_RESOURCE_STATE_COMMON state for CPU access through WriteToSubresource and ReadFromSubresource to be legal; but buffers do not. CPU からリソースへのアクセスは一般的に、Map/Unmap を通して行います。CPU access to a resource is typically done through Map/Unmap.

リソース バインドResource Binding