Direct3D 11 のテクスチャの概要
テクスチャ リソースは、テクセルを格納するように設計された、データの構造化されたコレクションです。 テクセルは、パイプラインで読み取ったり、書き込んだりすることができるテクスチャの最小単位を表します。 バッファーと異なり、テクスチャは、シェーダー ユニットに読み取られる際にテクスチャ サンプラーでフィルターを適用することができます。 テクスチャへのフィルター処理の適用方法はテクスチャの種類に影響されます。 各テクセルは 1 から 4 つの成分を含み、DXGI_FORMAT 列挙値により定義された DXGI 形式のいずれかで配置されます。
テクスチャは構造化されたリソースとして、既知のサイズで作成されます。 ただし、各テクスチャはリソースの作成時に型指定される場合もありますが、テクスチャをパイプラインにバインドするときにビューを使用して型を完全に指定するという条件で、リソース作成時に型指定されない場合もあります。
テクスチャの種類
テクスチャの種類には 1D、2D、および 3D があり、それぞれミップマップ付きまたはミップマップなしで作成できます。 Direct3D 11 では、テクスチャ配列とマルチサンプリング テクスチャもサポートされています。
1D テクスチャ
最も単純な形式の 1D テクスチャには、1 つのテクスチャ座標で処理できるテクスチャ データが格納されます。これをテクセルの配列として視覚化すると次の図のようになります。 1D テクスチャは ID3D11Texture1D インターフェイスで表されます。
各テクセルには、格納されているデータ形式に応じた色成分がいくつか含まれます。 より複雑なものになると、次の図に示すように、ミップマップ レベルを持つ 1D テクスチャを作成できます。
ミップマップ レベルは、上のレベルよりも 2 の累乗だけ小さいテクスチャです。 最上位レベルが最も詳細で (大きく)、レベルが下がるほど小さくなります。 1D ミップマップの最小レベルはテクセルを 1 つだけ含みます。 さらに、MIP レベルは常に 1:1 まで下がります。 ミップマップが奇数サイズのテクスチャに生成された場合、1 つ下のレベルは必ず偶数サイズになります (最下位レベルが 1 に達した場合を除く)。 たとえば、この図は次の最下位レベルが 2x1 テクスチャである 5x1 テクスチャを示しており、次の (および最後の) ミップ レベルは 1x1 サイズのテクスチャです。 レベルの識別には詳細レベル (LOD) と呼ばれるインデックスを使用します。LOD は、カメラにそれほど近くないジオメトリをレンダリングする場合に、小さいテクスチャにアクセスするために使用されます。
1D テクスチャ配列
Direct3D 11 では、テクスチャの配列もサポートされています。 1D テクスチャ配列は、 ID3D11Texture1D インターフェイスでも表されます。 1D テクスチャの配列は概念的に次の図のようになります。
このテクスチャ配列には 3 つのテクスチャが含まれています。 3 つのテクスチャはそれぞれテクスチャ幅が 5 になっています (5 は最初のレイヤーの要素数)。 また、各テクスチャには 3 レイヤーのミップマップも格納されています。
Direct3D のすべてのテクスチャ配列は、テクスチャの同次配列です。つまり、1 つのテクスチャ配列内にあるテクスチャはすべて、データ形式とサイズが (テクスチャ幅とミップマップ レベル数も含めて) 同じである必要があります。 各配列に含まれるすべてのテクスチャのサイズが一致してさえいれば、さまざまなサイズのテクスチャ配列を作成できます。
2D テクスチャと 2D テクスチャ配列
Texture2D リソースにはテクセルの 2D グリッドが 1 つ含まれています。 各テクセルは u ベクトルと v ベクトルで指定できます。 これはテクスチャ リソースであるため、ミップマップ レベルとサブリソースが格納される場合もあります。 2D テクスチャは ID3D11Texture2D インターフェイスで表されます。 すべてのデータが設定された 2D テクスチャ リソースは次の図のようになります。
このテクスチャ リソースには 1 つの 3x5 テクスチャと 3 つのミップマップ レベルが格納されています。
2D テクスチャ リソースは 2D テクスチャの同次配列であるため、各テクスチャのデータ形式とサイズは (ミップマップ レベルを含めて) 同じです。 2D テクスチャ配列は、 ID3D11Texture2D インターフェイスでも表されます。 次の図に示すように、このリソースはテクスチャに 2D データが含まれていることを除けば 1D テクスチャ配列とレイアウトが似ています。
このテクスチャ配列には 3 つのテクスチャが含まれています。各テクスチャは 3x5 で、2 つのミップマップ レベルを持ちます。
テクスチャ キューブとしての 2D テクスチャ配列の使用
テクスチャ キューブは、6 つのテクスチャ (キューブの各面に 1 つずつ) が含まれた 2D テクスチャ配列です。 すべてのデータが設定されたテクスチャ キューブは次の図のようになります。
6 つのテクスチャが含まれた 2D テクスチャ配列は、キューブ テクスチャ ビューを使ってパイプラインにバインドした後に、キューブ マップ組み込み関数を使ってシェーダー内から読み取ることができます。 テクスチャ キューブは、テクスチャ キューブの中心を起点とする 3D ベクトルによってシェーダーで処理されます。
注意
10_1 以上の機能レベルで作成するデバイスでは、テクスチャの数が 6 倍の配列内のテクスチャ キューブの数と等しいテクスチャ キューブの配列をサポートできます。 10_0 の機能レベルで作成するデバイスでは、6 つの顔の 1 つのテクスチャ キューブのみがサポートされます。 また、Direct3D 11 では、部分キューブマップはサポートされていません。
3D テクスチャ
3D テクスチャ リソース (ボリューム テクスチャとも呼ばれます) にはテクセルの 3D ボリュームが格納されます。 これはテクスチャ リソースであるため、ミップマップ レベルが含まれる場合もあります。 3D テクスチャは ID3D11Texture3D インターフェイスで表されます。 すべてのデータが設定された 3D テクスチャは次の図のようになります。
3D テクスチャ ミップマップ スライスを (レンダー ターゲット ビューを使って) レンダー ターゲット出力としてバインドした場合、3D テクスチャは n 個のスライスの 2D テクスチャ配列と同じように動作します。 特定のレンダー スライスは、出力データのスカラー コンポーネントをSV_RenderTargetArrayIndexシステム値として宣言することで、geometry-shader ステージから選択されます。
3D テクスチャ配列という概念は存在しません。そのため、3D テクスチャのサブリソースは単一のミップマップ レベルになります。
関連トピック