Direct3D 11 のバッファーの概要

バッファー リソースは、要素別にグループ化された完全型付きデータの集合です。バッファーを使用して、位置ベクトル、法線ベクトル、テクスチャー座標 (頂点バッファー)、インデックス (インデックス バッファー)、デバイス ステートなどのさまざまなデータを格納できます。個々のバッファー要素は、1 ~ 4 個の成分によって構成されます。バッファー要素には、圧縮したデータ値 (R8G8B8A8 サーフェス値など)、単一の 8 ビット整数、または 4 つの 32 ビット浮動小数点値を収めることができます。

バッファーは構造化されていないリソースとして作成されます。バッファーは構造化されていないのでミップマップ レベルは格納できません。また、読み込み時のフィルターの適用やマルチサンプリングもできません。

バッファーの種類

Direct3D 11 では、次のバッファー リソースの種類をサポートしています。どのバッファーの種類も、ID3D11Buffer インターフェイスによってカプセル化されます。

  • 頂点バッファー
  • インデックス バッファー
  • 定数バッファー

頂点バッファー

頂点バッファーには、ジオメトリの定義に使用する頂点データを格納します。頂点データには、位置座標、カラー データ、テクスチャー座標データ、法線データなどがあります。

頂点バッファーの最も単純は例は、位置データのみを収めたものです。これを図で表現すると次のようになります。

図形 1.  位置データを含む頂点バッファー

Ee422115.d3d10_resources_single_element_vb2(ja-jp,VS.85).png

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

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

Ee422115.d3d10_vertex_buffer_element(ja-jp,VS.85).png

この頂点バッファーは頂点ごとのデータを持ち、各頂点には 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.  インデックス バッファーの概念図

Ee422115.d3d10_index_buffer(ja-jp,VS.85).png

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

  • オフセット - バッファーの先頭から最初のインデックスまでのバイト数です。このオフセットは ID3D11DeviceContext::IASetIndexBuffer メソッドで指定します。
  • StartIndexLocation - オフセットから最初の頂点までのバイト数です。該当の描画呼び出しで使用します。
  • IndexCount - レンダリングするインデックスの数です。

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

定数バッファー

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

図形 4.  シェーダー定数バッファーの概念図

Ee422115.d3d10_shader_resource_buffer(ja-jp,VS.85).gif

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

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

シェーダーからシェーダー定数バッファーを読み取るには、load HLSL 組み込み関数を使用します。各シェーダー ステージは 15 個までのシェーダー定数バッファーを持つことができ、各バッファーでは最大 4096 個の定数を保持できます。

関連項目

バッファー