Direct3D 11 のバッファーの概要

バッファー リソースは完全に型指定されたデータのコレクションであり、複数の要素にグループ化されます。 バッファーを使用して、さまざまなデータを格納できます。たとえば、位置ベクトル、法線ベクトル、頂点バッファー内のテクスチャ座標、インデックス バッファー内のインデックス、デバイスの状態などのデータが格納されます。 バッファー要素は 1 ~ 4 つの成分で構成されます。 バッファー要素には、圧縮済みデータ値 (R8G8B8A8 サーフェス値)、単一の 8 ビット整数、または 4 つの 32 ビット浮動小数点値を含めることができます。

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

バッファーの種類

Direct3D 11 によりサポートされるバッファー リソースの種類は次のとおりです。 すべてのバッファー型は、 ID3D11Buffer インターフェイスによってカプセル化されます。

頂点バッファー

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

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

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

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

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

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

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

  • オフセット - バッファーの先頭から最初の頂点データまでのバイト数です。 オフセットは、ID3D11DeviceContext::IASetVertexBuffers メソッドを使用して指定できます。
  • BaseVertexLocation - 頂点バッファーから頂点を読み取る前に、各インデックスに追加された値。

頂点バッファーを作成する前に、 ID3D11InputLayout インターフェイスを作成してレイアウトを定義する必要があります。これは、 ID3D11Device::CreateInputLayout メソッドを 呼び出すことによって行われます。 入力レイアウト オブジェクトが作成されたら、 ID3D11DeviceContext::IASetInputLayout を呼び出して、入力アセンブラー ステージにバインドできます。

頂点バッファーを作成するには、 ID3D11Device::CreateBuffer を呼び出します。

インデックス バッファー

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

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

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

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

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

インデックス バッファーを作成するには、 ID3D11Device::CreateBuffer を呼び出します。

定数バッファー

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

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

各要素には 1 ~ 4 成分の定数が格納されます。この値は格納されるデータの形式によって決まります。 シェーダー定数バッファーを作成するには、 ID3D11Device::CreateBuffer を呼び出し、 D3D11_BIND_FLAG 列挙型のD3D11_BIND_CONSTANT_BUFFER メンバー 指定します。

定数バッファーでは、1 つのバインド フラグ (D3D11_BIND_CONSTANT_BUFFER) のみを使用できます。これは、他のバインド フラグと組み合わせることはできません。 シェーダー定数バッファーをパイプラインにバインドするには、 ID3D11DeviceContext::GSSetConstantBuffersID3D11DeviceContext::P SSetConstantBuffers、または ID3D11DeviceContext::VSSetConstantBuffers のいずれかのメソッドを呼び出します。

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

Buffers