Direct3D 11 のバッファーの概要

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

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

バッファーの種類

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

頂点バッファー

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

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

illustration of a vertex buffer that contains position data

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

illustration of a vertex buffer that contains position, normal, and texture data

この頂点バッファーには、頂点ごとのデータが格納されており、各頂点には 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 ビットの連続するインデックスを格納します。各インデックスは頂点バッファーの頂点を識別するのに使用されます。 インデックス バッファーを視覚化すると次の図のようになります。

illustration of an index buffer

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

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

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

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

定数バッファー

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

illustration of a shader-constant buffer

各要素には 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 の定数を保持できます。

バッファー