Direct3D 11 のバッファーの概要
バッファー リソースは、要素別にグループ化された完全型付きデータの集合です。バッファーを使用して、位置ベクトル、法線ベクトル、テクスチャー座標 (頂点バッファー)、インデックス (インデックス バッファー)、デバイス ステートなどのさまざまなデータを格納できます。個々のバッファー要素は、1 ~ 4 個の成分によって構成されます。バッファー要素には、圧縮したデータ値 (R8G8B8A8 サーフェス値など)、単一の 8 ビット整数、または 4 つの 32 ビット浮動小数点値を収めることができます。
バッファーは構造化されていないリソースとして作成されます。バッファーは構造化されていないのでミップマップ レベルは格納できません。また、読み込み時のフィルターの適用やマルチサンプリングもできません。
バッファーの種類
Direct3D 11 では、次のバッファー リソースの種類をサポートしています。どのバッファーの種類も、ID3D11Buffer インターフェイスによってカプセル化されます。
- 頂点バッファー
- インデックス バッファー
- 定数バッファー
頂点バッファー
頂点バッファーには、ジオメトリの定義に使用する頂点データを格納します。頂点データには、位置座標、カラー データ、テクスチャー座標データ、法線データなどがあります。
頂点バッファーの最も単純は例は、位置データのみを収めたものです。これを図で表現すると次のようになります。
図形 1. 位置データを含む頂点バッファー
多くの場合、頂点バッファーには 3D の頂点を完全に指定するために必要なすべてのデータが含まれています。頂点ごとの位置座標、法線座標、およびテクスチャー座標を含む頂点バッファーなどは、その一例です。このようなデータは、頂点ごとの要素の集合として次のように構成されます。
図形 2. 位置、法線、およびテクスチャーのデータを含む頂点バッファー
この頂点バッファーは頂点ごとのデータを持ち、各頂点には 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 ビットの連続するインデックスを格納します。各インデックスは頂点バッファーの頂点を識別するのに使用されます。インデックス バッファーを図で表現すると次のようになります。
図形 3. インデックス バッファーの概念図
インデックス バッファーに格納される一連のインデックスは、次のパラメーターによって位置指定されます。
- オフセット - バッファーの先頭から最初のインデックスまでのバイト数です。このオフセットは ID3D11DeviceContext::IASetIndexBuffer メソッドで指定します。
- StartIndexLocation - オフセットから最初の頂点までのバイト数です。該当の描画呼び出しで使用します。
- IndexCount - レンダリングするインデックスの数です。
インデックス バッファーを作成するには、ID3D11Device::CreateBuffer を呼び出します。
定数バッファー
定数バッファーを使用すると、パイプラインにシェーダー定数データを効率的に渡すことができます。定数バッファーには、ストリーム出力ステージの結果を格納できます。定数バッファーは、概念的には要素が 1 つの頂点バッファーに類似しています。
図形 4. シェーダー定数バッファーの概念図
各要素は 1 から 4 までの成分定数を格納します。この数は格納されるデータのフォーマットによって決定されます。シェーダー定数バッファーを作成するには、ID3D11Device::CreateBuffer を呼び出して、D3D11_BIND_FLAG 列挙型の D3D11_BIND_CONSTANT_BUFFER メンバーを指定します。
定数バッファーで使用できるのは、単一のバインド フラグ (D3D11_BIND_CONSTANT_BUFFER) のみです。他のバインド フラグを組み合わせることはできません。シェーダー定数バッファーをパイプラインにバインドするには、ID3D11DeviceContext::GSSetConstantBuffers、ID3D11DeviceContext::PSSetConstantBuffers、または ID3D11DeviceContext::VSSetConstantBuffers のいずれかのメソッドを呼び出します。
シェーダーからシェーダー定数バッファーを読み取るには、load HLSL 組み込み関数を使用します。各シェーダー ステージは 15 個までのシェーダー定数バッファーを持つことができ、各バッファーでは最大 4096 個の定数を保持できます。