バッファーの概要

バッファー リソースは完全に型指定されたデータのコレクションであり、要素にグループ化されます。 バッファーには、頂点バッファー 内のテクスチャ座標、インデックス バッファー内のインデックス、定数バッファー内のシェーダー定数データ、位置ベクトル、法線ベクトル、デバイスの状態などのデータが格納されます。

バッファー要素は 1 ~ 4 つの成分で構成されます。 バッファー要素には、圧縮済みデータ値 (R8G8B8A8 サーフェス値)、単一の 8 ビット整数、または 4 つの 32 ビット浮動小数点値を含めることができます。

バッファーは構造化されていないリソースとして作成されます。 構造化されていないため、バッファーはミップマップ レベルを格納できず、読み取り時にフィルター処理を適用したり、マルチサンプリングを適用したりすることはできません。

バッファーの種類

Direct3D 11 によりサポートされるバッファー リソースの種類は次のとおりです。

頂点バッファー

頂点バッファーには、ジオメトリの定義に使われる頂点データが格納されます。 頂点データには、位置座標、色データ、テクスチャ座標データ、法線データなどが格納されます。

頂点バッファーの最も単純な例は、位置データのみが格納されたものです。 これを視覚化すると次の図のようになります。

位置データを格納する頂点バッファーの図

多くの場合、頂点バッファーには 3D の頂点を完全に指定するために必要なすべてのデータが含まれます。 頂点ごとの位置座標、法線座標、およびテクスチャ座標を格納した頂点バッファーが、その一例です。 このようなデータは、次の図に示すように、頂点ごとの要素のセットとしてまとめられます。

位置、法線、およびテクスチャのデータを含む頂点バッファーの図

この頂点バッファーには、頂点ごとのデータが格納されており、各頂点には 3 つの要素 (位置座標、法線座標、およびテクスチャ座標) が格納されています。 一般的に、位置座標と法線座標はそれぞれ 3 つの 32 ビット浮動小数点を使って指定され、テクスチャ座標は 2 つの 32 ビット浮動小数点を使って指定されます。

頂点バッファーのデータにアクセスするには、どの頂点にアクセスするのかという情報と、次の追加のバッファー パラメーターの情報が必要になります。

  • オフセット - バッファーの先頭から最初の頂点データまでのバイト数です。
  • BaseVertexLocation - オフセットから、該当する描画呼び出しで使用される最初の頂点までのバイト数です。

頂点バッファーを作成する前に、レイアウトを定義する必要があります。 入力レイアウト オブジェクトを作成したら、それを入力アセンブラー (IA) ステージにバインドします。

インデックス バッファー

インデックス バッファーには、頂点バッファーへの整数オフセットが格納されます。このバッファーは、より効率的なプリミティブのレンダリングに使われます。 インデックス バッファーは 16 ビットまたは 32 ビットの連続するインデックスを格納します。各インデックスは頂点バッファーの頂点を識別するのに使用されます。 インデックス バッファーを視覚化すると次の図のようになります。

インデックス バッファーの図

インデックス バッファーに格納される一連のインデックスの位置は、次のパラメーターを使用して特定します。

  • オフセット - インデックス バッファーのベース アドレスからのバイト数です。
  • StartIndexLocation - ベース アドレスからの最初のインデックス バッファー要素とオフセットを指定します。 開始位置は、最初にレンダリングするインデックスを表します。
  • IndexCount - レンダリングするインデックスの数です。

インデックス バッファーの開始 = インデックス バッファーのベース アドレス + オフセット (バイト) + StartIndexLocation * ElementSize (バイト)。

この計算では、ElementSize は各インデックス バッファー要素のサイズ (2 または 4 バイト) です。

定数バッファー

定数バッファーを使うと、シェーダー定数データをパイプラインに効率的に提供できます。 定数バッファーを使用して、ストリーム出力ステージの結果を格納できます。 次の図に示すように、定数バッファーは、概念的には要素が 1 つの頂点バッファーに似ています。

シェーダー定数バッファーの図

各要素には 1 ~ 4 成分の定数が格納されます。この値は格納されるデータの形式によって決まります。

定数バッファーは、単一のバインド フラグのみ使うことができ、他のバインド フラグと組み合わせることはできません。

シェーダーからシェーダー定数バッファーを読み取るには、HLSL 読み込み関数を使います。 各シェーダー ステージでは最大 15 個の定数バッファーを使用でき、各バッファーには最大 4,096 の定数を保持できます。

頂点バッファーとインデックス バッファー