バッファーの概要Introduction to buffers

バッファー リソースは完全に型指定されたデータのコレクションであり、要素にグループ化されます。A buffer resource is a collection of fully typed data, grouped into elements. バッファーには、頂点バッファー 内のテクスチャ座標、インデックス バッファー内のインデックス、定数バッファー内のシェーダー定数データ、位置ベクトル、法線ベクトル、デバイスの状態などのデータが格納されます。Buffers store data, such as texture coordinates in a vertex buffer, indexes in an index buffer, shader constants data in a constant buffer, position vectors, normal vectors, or device state.

バッファー要素は 1 ~ 4 つの成分で構成されます。A buffer element is made up of 1 to 4 components. バッファー要素には、圧縮済みデータ値 (R8G8B8A8 サーフェス値)、単一の 8 ビット整数、または 4 つの 32 ビット浮動小数点値を含めることができます。Buffer elements can include packed data values (like R8G8B8A8 surface values), single 8-bit integers, or four 32-bit floating point values.

バッファーは構造化されていないリソースとして作成されます。A buffer is created as an unstructured resource. 構造化されていないため、バッファーはミップマップ レベルを格納できず、読み取り時にフィルター処理を適用したり、マルチサンプリングを適用したりすることはできません。Because it is unstructured, a buffer cannot contain any mipmap levels, it cannot get filtered when read, and it cannot be multisampled.

バッファーの種類Buffer Types

Direct3D 11 によりサポートされるバッファー リソースの種類は次のとおりです。The following are the buffer resource types supported by Direct3D 11.

頂点バッファーVertex Buffer

頂点バッファーには、ジオメトリの定義に使われる頂点データが格納されます。A vertex buffer contains the vertex data used to define your geometry. 頂点データには、位置座標、色データ、テクスチャ座標データ、法線データなどが格納されます。Vertex data includes position coordinates, color data, texture coordinate data, normal data, and so on.

頂点バッファーの最も単純な例は、位置データのみが格納されたものです。The simplest example of a vertex buffer is one that only contains position data. これを視覚化すると次の図のようになります。It can be visualized like the following illustration.


多くの場合、頂点バッファーには 3D の頂点を完全に指定するために必要なすべてのデータが含まれます。More often, a vertex buffer contains all the data needed to fully specify 3D vertices. 頂点ごとの位置座標、法線座標、およびテクスチャ座標を格納した頂点バッファーが、その一例です。An example of this could be a vertex buffer that contains per-vertex position, normal and texture coordinates. このようなデータは、次の図に示すように、頂点ごとの要素のセットとしてまとめられます。This data is usually organized as sets of per-vertex elements, as shown in the following illustration.


この頂点バッファーには、頂点ごとのデータが格納されており、各頂点には 3 つの要素 (位置座標、法線座標、およびテクスチャ座標) が格納されています。This vertex buffer contains per-vertex data; each vertex stores three elements (position, normal, and texture coordinates). 一般的に、位置座標と法線座標はそれぞれ 3 つの 32 ビット浮動小数点を使って指定され、テクスチャ座標は 2 つの 32 ビット浮動小数点を使って指定されます。The position and normal are each typically specified using three 32-bit floats and the texture coordinates using two 32-bit floats.

頂点バッファーのデータにアクセスするには、どの頂点にアクセスするのかという情報と、次の追加のバッファー パラメーターの情報が必要になります。To access data from a vertex buffer you need to know which vertex to access, plus the following additional buffer parameters:

  • オフセット - バッファーの先頭から最初の頂点データまでのバイト数です。Offset - the number of bytes from the start of the buffer to the data for the first vertex.
  • BaseVertexLocation - オフセットから、該当する描画呼び出しで使用される最初の頂点までのバイト数です。BaseVertexLocation - the number of bytes from the offset to the first vertex used by the appropriate draw call.

頂点バッファーを作成する前に、レイアウトを定義する必要があります。Before you create a vertex buffer, you need to define its layout. 入力レイアウト オブジェクトを作成したら、それを入力アセンブラー (IA) ステージにバインドします。After the input-layout object is created, you bind it to the Input Assembler (IA) stage.

インデックス バッファーIndex Buffer

インデックス バッファーには、頂点バッファーへの整数オフセットが格納されます。このバッファーは、より効率的なプリミティブのレンダリングに使われます。Index buffers contain integer offsets into vertex buffers and are used to render primitives more efficiently. インデックス バッファーは 16 ビットまたは 32 ビットの連続するインデックスを格納します。各インデックスは頂点バッファーの頂点を識別するのに使用されます。An index buffer contains a sequential set of 16-bit or 32-bit indices; each index is used to identify a vertex in a vertex buffer. インデックス バッファーを視覚化すると次の図のようになります。An index buffer can be visualized like the following illustration.

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

インデックス バッファーに格納される一連のインデックスの位置は、次のパラメーターを使用して特定します。The sequential indices stored in an index buffer are located with the following parameters:

  • オフセット - インデックス バッファーのベース アドレスからのバイト数です。Offset - the number of bytes from the base address of the index buffer.
  • StartIndexLocation - ベース アドレスからの最初のインデックス バッファー要素とオフセットを指定します。StartIndexLocation - specifies the first index buffer element from the base address and the offset. 開始位置は、最初にレンダリングするインデックスを表します。The start location represents the first index to render.
  • IndexCount - レンダリングするインデックスの数です。IndexCount - the number of indices to render.

インデックス バッファーの開始インデックス バッファーのベース アドレスのオフセット (バイト) + StartIndexLocation = * ElementSize (バイト単位)。Start of Index Buffer = Index Buffer Base Address + Offset (bytes) + StartIndexLocation * ElementSize (bytes);

この計算では、ElementSize は各インデックス バッファー要素のサイズ (2 または 4 バイト) です。In this calculation, ElementSize is the size of each index buffer element, which is either two or four bytes.

定数バッファーConstant Buffer

定数バッファーを使うと、シェーダー定数データをパイプラインに効率的に提供できます。A constant buffer allows you to efficiently supply shader constants data to the pipeline. 定数バッファーを使用して、ストリーム出力ステージの結果を格納できます。You can use a constant buffer to store the results of the stream-output stage. 次の図に示すように、定数バッファーは、概念的には要素が 1 つの頂点バッファーに似ています。Conceptually, a constant buffer looks just like a single-element vertex buffer, as shown in the following illustration.


各要素には 1 ~ 4 成分の定数が格納されます。この値は格納されるデータの形式によって決まります。Each element stores a 1-to-4 component constant, determined by the format of the data stored.

定数バッファーは、単一のバインド フラグのみ使うことができ、他のバインド フラグと組み合わせることはできません。A constant buffer can only use a single bind flag , which cannot be combined with any other bind flag.

シェーダーからシェーダー定数バッファーを読み取るには、HLSL 読み込み関数を使います。To read a shader-constant buffer from a shader, use an HLSL load function. 各シェーダー ステージでは最大 15 個の定数バッファーを使用でき、各バッファーには最大 4,096 の定数を保持できます。Each shader stage allows up to 15 shader-constant buffers; each buffer can hold up to 4096 constants.

関連トピックRelated topics

頂点バッファーとインデックス バッファーVertex and index buffers