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 ビットの連続するインデックスを格納します。各インデックスは頂点バッファーの頂点を識別するのに使用されます。 インデックス バッファーを視覚化すると次の図のようになります。
インデックス バッファーに格納される一連のインデックスの位置は、次のパラメーターを使用して特定します。
- オフセット - インデックス バッファーのベース アドレスからのバイト数です。 オフセットは ID3D11DeviceContext::IASetIndexBuffer メソッドに渡されます。
- StartIndexLocation - ベース アドレスからの最初のインデックス バッファー要素と 、IASetIndexBuffer で提供されるオフセットを指定します。 開始場所は 、ID3D11DeviceContext::D rawIndexed メソッドまたは ID3D11DeviceContext::D rawIndexedInstanced メソッドに渡され、レンダリングする最初のインデックスを表します。
- IndexCount - レンダリングするインデックスの数です。 数値は DrawIndexed メソッドに渡されます
インデックス バッファーの開始 = インデックス バッファーのベース アドレス + オフセット (バイト) + 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::GSSetConstantBuffers、 ID3D11DeviceContext::P SSetConstantBuffers、または ID3D11DeviceContext::VSSetConstantBuffers のいずれかのメソッドを呼び出します。
シェーダーからシェーダー定数バッファーを読み取る場合は、HLSL 読み込み関数 (Load など) を使用します。 各シェーダー ステージでは最大 15 個の定数バッファーを使用でき、各バッファーには最大 4,096 の定数を保持できます。
関連トピック