次の方法で共有


サブリソース (Direct3D 12 グラフィックス)

リソースをサブリソースに分割する方法と、サブリソースの単一、複数、またはスライスを参照する方法について説明します。

サブリソースの例

リソースにバッファーが含まれている場合は、インデックスが 0 のサブリソースが 1 つだけ含まれます。 リソースにテクスチャ (またはテクスチャ配列) が含まれている場合、サブリソースの参照はより複雑になります。

リソース全体 (ID3D12GraphicsCommandList::CopyResource メソッドなど) にアクセスする API もあれば、リソースの一部 (ID3D12Resource::ReadFromSubresource メソッドなど) にアクセスする API もあります。 リソースの一部にアクセスするメソッドでは、通常、ビューの説明 (D3D12_TEX2D_ARRAY_SRV 構造など) を使用して、アクセスするサブリソースを指定します。 完全な一覧については、「サブリソース API」セクションを参照してください。

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

特定のサブリソースにインデックスを付けるために、各配列エントリのインデックスが作成されるときに、mip レベルが最初にインデックス付けされます。

サブリソースのインデックス作成する

Mip スライス

次の図に示すように、ミップ スライスには、配列内のすべてのテクスチャに対して 1 つのミップマップ レベルが含まれています。

サブリソース ミップ スライスする

配列スライス

次の図に示すように、テクスチャの配列(ミップマップを含む各テクスチャ)を指定すると、配列スライスには、1 つのテクスチャとそのすべてのミップ レベルが含まれます。

サブリソース配列スライスする

平面スライス

通常、平面形式は RGBA データを格納するために使用されませんが、その場合 (おそらく 24bpp RGB データ)、1 つの平面は赤い画像、1 つは緑、1 つは青の画像を表します。 ただし、1 つの平面は必ずしも 1 つの色であるとは限りませんが、2 つ以上の色を 1 つの平面に結合できます。 より一般的に、平面データは、サブサンプリングされた YCbCr および Depth-Stencil データに使用されます。 Depth-Stencil は、ミップマップ、配列、および複数の平面 (多くの場合、深度の場合は平面 0、ステンシルの場合は平面 1) を完全にサポートする唯一の形式です。

2 つの Depth-Stencil イメージの配列のサブリソース インデックス作成 (それぞれ 3 つのミップ レベルを持つ) を次に示します。

深度ステンシルのインデックス作成する

サブサンプリングされた YCbCr は配列をサポートし、平面を持っていますが、ミップマップはサポートしていません。 YCbCr 画像には 2 つの平面があり、1 つは人間の目が最も敏感な輝度 (Y) 用と、人間の目の感度が低い色度 (Cb と Cr の両方) 用です。 この形式では、輝度に影響を与えずに画像を圧縮するためにクロミナンス値を圧縮できます。そのための一般的なビデオ圧縮形式ですが、静止画像を圧縮するために使用されます。 次の図は NV12 形式を示しています。色度は輝度の解像度の 4 分の 1 に圧縮されています。つまり、各平面の幅は同じで、色度平面は輝度平面の高さの半分です。 平面は、上記の Depth-Stencil 例と同じ方法でサブリソースとしてインデックスが作成されます。

nv12形式のする

Direct3D 11 には平面形式が存在しましたが、コピー操作やマッピング操作など、個々の平面に個別に対応することはできませんでした。 これは Direct3D 12 で変更され、各プレーンが独自のサブリソース ID を受け取りました。 サブリソース ID を計算するための次の 2 つの方法を比較します。

Direct3D 11

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

Direct3D 12

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

ほとんどのハードウェアでは、プレーン N のメモリは、プレーン N-1 の直後に常に割り当てられると想定されています。

サブリソースを使用する代わりに、アプリはプレーンごとに完全に個別のリソースを割り当てることができるということです。 この場合、アプリケーションはデータが平面であることを認識し、複数のリソースを使用してデータを表します。

複数のサブリソース

シェーダー リソース ビューでは、上で説明したスライスの 1 つを使用し、ビュー構造 (D3D12_TEX2D_ARRAY_SRVなど) 内のフィールドを慎重に使用して、サブリソースの任意の四角形領域を選択できます (画像に示すように)。

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

レンダー ターゲット ビューでは、1 つのサブリソースまたはミップ スライスのみを使用でき、複数のミップ スライスのサブリソースを含めることはできません。 つまり、レンダー ターゲット ビュー内のすべてのテクスチャは同じサイズである必要があります。 シェーダー リソース ビューでは、画像に示すように、サブリソースの任意の四角形領域を選択できます。

サブリソース API

次の API は、サブリソースを参照して操作します。

列挙 体:

次の構造体には、PlaneSlice インデックスが含まれています。そのほとんどには、mipSlice インデックス 含まれています。

次の構造体には、ArraySlice インデックス 含まれています。ほとんどの構造体には、MipSlice インデックスが含まれています。

次の構造体には mipSlice インデックス 含まれていますが、ArraySlice も PlaneSlice インデックス もありません。

次の構造体は、サブリソースも参照します。

メソッド:

WriteToSubresourceを介した CPU アクセスと ReadFromSubresource有効にするには、テクスチャが D3D12_RESOURCE_STATE_COMMON 状態である必要があります。ただし、バッファーには含まれません。 リソースへの CPU アクセスは、通常、マップ/マップ解除使用して行われます。

リソース バインド