リソースの種類Resource types

リソースの種類によって、レイアウト (またはメモリ使用量) はそれぞれ異なります。Different types of resources have a distinct layout (or memory footprint). Direct3D パイプラインで使用されるリソースはすべて、2 つの基本的なリソースの種類であるバッファーテクスチャから派生したものです。All resources used by the Direct3D pipeline derive from two basic resource types: buffers and textures. バッファーは未加工データ (要素) のコレクションで、テクスチャはテクセル (テクスチャ要素) のコレクションです。A buffer is a collection of raw data (elements); a texture is a collection of texels (texture elements).

リソースのレイアウト (またはメモリ使用量) を完全に指定する方法は次の 2 つです。There are two ways to fully specify the layout (or memory footprint) of a resource:

項目Item 説明Description

型指定されました。Typed

リソース作成時に型を完全に指定します。Fully specify the type when the resource is created.

型指定されていません。Typeless

リソースをパイプラインにバインドするときに型を完全に指定します。Fully specify the type when the resource is bound to the pipeline.

 

バッファー リソースBuffer resources

バッファー リソースは完全に型指定されたデータのコレクションであり、内部的にはバッファーに要素が格納されます。A buffer resource is a collection of fully typed data; internally, a buffer contains elements. 要素は 1 ~ 4 つの成分で構成されます。An element is made up of 1 to 4 components. 要素のデータ型の例としては、圧縮済みデータ (R8G8B8A8 など)、単一の 8 ビット整数、4 つの 32 ビット浮動小数点などがあります。Examples of element data types include: a packed data value (like R8G8B8A8), a single 8-bit integer, four 32-bit float values. これらのデータ型は、位置ベクトル、法線ベクトル、頂点バッファーのテクスチャ座標、インデックス バッファーのインデックス、デバイスの状態などのデータを格納するために使用されます。These data types are used to store data, such as a position vector, a normal vector, a texture coordinate in a vertex buffer, an index in an index buffer, or device state.

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

バッファーの種類Buffer types

頂点バッファーVertex buffer

バッファーは要素のコレクションであり、頂点バッファーには頂点単位のデータが格納されます。A buffer is a collection of elements; a vertex buffer contains per-vertex data. 頂点バッファーの最も単純な例は、位置データなど、1 種類のデータが格納されたものです。The simplest example is a vertex buffer that contains one type of data, such as 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.

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

この頂点バッファーには 8 つの頂点に関する頂点ごとのデータが含まれており、各頂点には 3 つの要素 (位置座標、法線座標、およびテクスチャ座標) が格納されています。This vertex buffer contains per-vertex data for eight vertices; 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 and these other 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 by creating an input-layout object. 入力レイアウト オブジェクトを作成したら、それを入力アセンブラー (IA) ステージにバインドします。Once the input-layout object is created, bind it to the Input Assembler (IA) stage.

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

インデックス バッファーは 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. インデックス バッファーと 1 つ以上の頂点バッファーを併せて使用して、IA ステージにデータを渡すことをインデックス作成と呼びます。Using an index buffer with one or more vertex buffers to supply data to the IA stage is called indexing. インデックス バッファーを視覚化すると次の図のようになります。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 start of the buffer to the first index.
  • StartIndexLocation - オフセットから、該当する描画呼び出しで使用される最初の頂点までのバイト数です。StartIndexLocation - the number of bytes from the offset to the first vertex used by the appropriate draw call.
  • IndexCount - レンダリングするインデックスの数です。IndexCount - the number of indices to render.

インデックス バッファーは、ストリップカット インデックスで区切ることによって、複数のライン ストリップまたはトライアングル ストリップ (プリミティブ トポロジ) をまとめることができます。An index buffer can stitch together multiple line or triangle strips (primitive topologies) by separating each with a strip-cut index. ストリップカット インデックスを使用すると、複数のライン ストリップまたはトライアングル ストリップを 1 つの描画呼び出しを使って描画することができます。A strip-cut index allows multiple line or triangle strips to be drawn with a single draw call. ストリップカット インデックスは、インデックスに使用できる最大の値のことです (16 ビット インデックスの場合は 0xffff、32 ビット インデックスの場合は 0xffffffff)。A strip-cut index is the maximum possible value for the index (0xffff for a 16-bit index, 0xffffffff for a 32-bit index). ストリップ カット インデックスはインデックス付きプリミティブのワインディング順序をリセットします。ストリップ カット インデックスを使用すれば、縮退三角形を使用しなくても、トライアングル ストリップの適切なワインディング順序を維持できます。The strip-cut index resets the winding order in indexed primitives and can be used to remove the need for degenerate triangles that may otherwise be required to maintain proper winding order in a triangle strip. 次の図は、ストリップカット インデックスの例を示しています。The following illustration shows an example of a strip-cut index.

ストリップカット インデックスの図

定数バッファーConstant buffer

Direct3D には、シェーダー定数バッファーまたは単に定数バッファーと呼ばれる、シェーダー定数を提供するためのバッファーがあります。Direct3D has a buffer for supplying shader constants called a shader-constant buffer or simply a constant buffer. 概念的には、次の図に示すように、要素が 1 つの頂点バッファーに似ています。Conceptually, it looks 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.

定数バッファーを使用すると、複数のシェーダー定数をグループにまとめて同時にコミットできます。それぞれのシェーダー定数を個別の呼び出しで別々にコミットすることがないので、シェーダー定数の更新に必要な帯域を削減することができます。Constant buffers reduce the bandwidth required to update shader constants by allowing shader constants to be grouped together and committed at the same time rather than making individual calls to commit each constant separately.

シェーダーは、定数バッファーに含まれていない変数を読み取る場合と同様に、変数名を使って定数バッファー内の変数を継続的に直接読み取ります。A shader continues to read variables in a constant buffer directly by variable name in the same manner variables that are not part of a constant buffer are read.

各シェーダー ステージでは最大 15 個の定数バッファーを使用でき、各バッファーには最大 4,096 の定数を保持できます。Each shader stage allows up to 15 shader-constant buffers; each buffer can hold up to 4096 constants.

定数バッファーを使用して、ストリーム出力ステージの結果を保存します。Use a constant buffer to store the results of the stream-output stage.

シェーダーで定数バッファーを宣言する例については、「シェーダー定数 (DirectX HLSL)」をご覧ください。See Shader Constants (DirectX HLSL) for an example of declaring a constant buffer in a shader.

テクスチャのリソースTexture resources

テクスチャ リソースは、テクセルを格納するように設計された、データの構造化されたコレクションです。A texture resource is a structured collection of data designed to store texels. バッファーと異なり、テクスチャは、シェーダー ユニットに読み取られる際にテクスチャ サンプラーでフィルターを適用することができます。Unlike buffers, textures can be filtered by texture samplers as they are read by shader units. テクスチャへのフィルター処理の適用方法はテクスチャの種類に影響されます。The type of texture impacts how the texture is filtered. テクセルは、パイプラインで読み取ったり、書き込んだりすることができるテクスチャの最小単位を表します。A texel represents the smallest unit of a texture that can be read or written to by the pipeline. 各テクセルには DXGI 形式のいずれかに配置された、1 ~ 4 のコンポーネントが含まれています (を参照してください DXGI_形式)。Each texel contains 1 to 4 components, arranged in one of the DXGI formats (see DXGI_FORMAT).

テクスチャは構造化されたリソースとして作成されるため、そのサイズがわかります。Textures are created as a structured resource so that their size is known. ただし、各テクスチャはリソース作成時に型指定される場合もありますが、テクスチャをパイプラインにバインドするときにビューを使用して型を完全に指定するという条件で、リソース作成時に型指定されない場合もあります。However, each texture may be typed or typeless at resource-creation time, as long as the type is fully specified using a view when the texture is bound to the pipeline.

テクスチャの種類Texture types

テクスチャのいくつかの種類があります。1 D、2 D、3 D、mipmap の有無をそれぞれ作成できます。There are several types of textures: 1D, 2D, 3D, each of which can be created with or without mipmaps. Direct3D では、テクスチャ配列とマルチサンプリングされたテクスチャもサポートされています。Direct3D also supports texture arrays and multisampled textures.

1 D のテクスチャ1D Texture

最も単純な形式の 1D テクスチャには、1 つのテクスチャ座標で処理できるテクスチャ データが格納されます。これをテクセルの配列として視覚化すると次の図のようになります。A 1D texture in its simplest form contains texture data that can be addressed with a single texture coordinate; it can be visualized as an array of texels, as shown in the following illustration.

1D テクスチャの図

各テクセルには、格納されているデータ形式に応じた色成分がいくつか含まれます。Each texel contains a number of color components depending on the format of the data stored. より複雑なものになると、次の図に示すように、ミップマップ レベルを持つ 1D テクスチャを作成できます。Adding more complexity, you can create a 1D texture with mipmap levels, as shown in the following illustration.

ミップマップ レベルを持つ 1D テクスチャの図

ミップマップ レベルは、上のレベルよりも 2 の累乗だけ小さいテクスチャです。A mipmap level is a texture that is a power-of-two smaller than the level above it. 最上位レベルが最も詳細で (大きく)、レベルが下がるほど小さくなります。1D ミップマップの最小レベルはテクセルを 1 つだけ含みます。The top-most level contains the most detail, each subsequent level is smaller; for a 1D mipmap, the smallest level contains one texel. 各レベルの識別には詳細レベル (LOD) と呼ばれるインデックスを使用します。カメラにそれほど近くないジオメトリをレンダリングする場合は、LOD を使って小さいテクスチャにアクセスできます。The differing levels are identified by an index called a LOD (level-of-detail); you can use the LOD to access a smaller texture when rendering geometry that is not as close to the camera.

テクスチャ 1d の配列1D texture array

Direct3D 10 には、テクスチャの配列用の新しいデータ構造も用意されています。Direct3D 10 also has a new data structure for an array of textures. 1D テクスチャの配列は概念的に次の図のようになります。An array of 1D textures looks conceptually like the following illustration.

1D テクスチャ配列の図

このテクスチャ配列には 3 つのテクスチャが含まれています。This texture array contains three textures. 3 つのテクスチャはそれぞれテクスチャ幅が 5 になっています (5 は最初のレイヤーの要素数)。Each of the three textures has a texture width of 5 (which is the number of elements in the first layer). また、各テクスチャには 3 レイヤーのミップマップも格納されています。Each texture also contains a 3-layer mipmap.

Direct3D のすべてのテクスチャ配列は、テクスチャの同次配列です。つまり、1 つのテクスチャ配列内にあるテクスチャはすべて、データ形式とサイズが (テクスチャ幅とミップマップ レベル数も含めて) 同じである必要があります。All texture arrays in Direct3D are a homogeneous array of textures; this means that every texture in a texture array must have the same data format and size (including texture width and number of mipmap levels). 各配列に含まれるすべてのテクスチャのサイズが一致してさえいれば、さまざまなサイズのテクスチャ配列を作成できます。You may create texture arrays of different sizes, as long as all the textures in each array match in size.

2D テクスチャと 2D テクスチャ配列2D Texture and 2D Texture Array

Texture2D リソースにはテクセルの 2D グリッドが 1 つ含まれています。A Texture2D resource contains a 2D grid of texels. 各テクセルは u ベクトルと v ベクトルで指定できます。Each texel is addressable by a u, v vector. これはテクスチャ リソースであるため、ミップマップ レベルとサブリソースが格納される場合もあります。Because it is a texture resource, it may contain mipmap levels, and subresources. すべてのデータが設定された 2D テクスチャ リソースは次の図のようになります。A fully populated 2D texture resource looks like the following illustration.

2D テクスチャ リソースの図

このテクスチャ リソースには 1 つの 3x5 テクスチャと 3 つのミップマップ レベルが格納されています。This texture resource contains a single 3x5 texture with three mipmap levels.

Texture2DArray リソースは 2D テクスチャの同次配列であるため、各テクスチャのデータ形式とサイズは (ミップマップ レベルを含めて) 同じです。A Texture2DArray resource is a homogeneous array of 2D textures; that is, each texture has the same data format and dimensions (including mipmap levels). このリソースは、テクスチャに 2D データが含まれていることを除けば 1D テクスチャ配列とレイアウトが似ています。したがって、次のような図になります。It has a similar layout as the 1D texture array except that the textures now contain 2D data, and therefore looks like the following illustration.

2D テクスチャ配列のリソースの図

このテクスチャ配列には 3 つのテクスチャが含まれています。各テクスチャは 3x5 で、2 つのミップマップ レベルを持ちます。This texture array contains three textures; each texture is 3x5 with two mipmap levels.

テクスチャ キューブとして、Texture2DArray を使用します。Using a Texture2DArray as a Texture Cube

テクスチャ キューブは、6 つのテクスチャ (キューブの各面に 1 つずつ) が含まれた 2D テクスチャ配列です。A texture cube is a 2D texture array that contains 6 textures, one for each face of the cube. すべてのデータが設定されたテクスチャ キューブは次の図のようになります。A fully populated texture cube looks like the following illustration.

テクスチャ キューブを表す 2D テクスチャ配列のリソースの図

6 つのテクスチャが含まれた 2D テクスチャ配列は、キューブ テクスチャ ビューを使ってパイプラインにバインドした後に、キューブ マップ組み込み関数を使ってシェーダー内から読み取ることができます。A 2D texture array that contains 6 textures may be read from within shaders with the cube map intrinsic functions, after they are bound to the pipeline with a cube-texture view. テクスチャ キューブは、テクスチャ キューブの中心を起点とする 3D ベクトルによってシェーダーで処理されます。Texture cubes are addressed from the shader with a 3D vector pointing out from the center of the texture cube.

3D テクスチャ3D Texture

Texture3D リソース (ボリューム テクスチャとも呼ばれます) にはテクセルの 3D ボリュームが格納されます。A Texture3D resource (also known as a volume texture) contains a 3D volume of texels. これはテクスチャ リソースであるため、ミップマップ レベルが含まれる場合もあります。Since it is a texture resource, it may contain mipmap levels. すべてのデータが設定された 3D テクスチャは次の図のようになります。A fully populated 3D texture looks like the following illustration.

3D テクスチャ リソースの図

3D テクスチャ ミップマップ スライスを (レンダー ターゲット ビューを使って) レンダー ターゲット出力としてバインドした場合、3D テクスチャは n 個のスライスの 2D テクスチャ配列と同じように動作します。When a 3D texture mipmap slice is bound as a render target output (with a render-target view), the 3D texture behaves identically to a 2D texture array with n slices. 特定のレンダー スライスはジオメトリ シェーダー ステージで選択します。The particular render slice is chosen from the geometry-shader stage.

3D テクスチャ配列という概念は存在しません。そのため、3D テクスチャのサブリソースは単一のミップマップ レベルになります。There is no concept of a 3D texture array; therefore a 3D texture subresource is a single mipmap level.

サブリソースSubresources

Direct3D API は、リソース全体またはリソースのサブセットを参照します。The Direct3D API references entire resources or subsets of resources. リソースの一部を指定するために、Direct3D ではサブリソースという用語が新たに用意されています。つまり、リソースのサブセットのことです。To specify portion of resources, Direct3D has coined the term subresources, which means a subset of a resource.

バッファーは単一のサブリソースと定義されます。A buffer is defined as a single subresource. テクスチャはもう少し複雑です。テクスチャの種類が複数存在していて (1D、2D など)、その一部ではミップマップ レベルやテクスチャ配列がサポートされているためです。Textures are a little more complicated as there are several different texture types (1D, 2D, etc.) some of which support mipmap levels and/or texture arrays. 最も単純なケースから始めると、1D テクスチャは単一のサブリソースとして定義され、次の図のようになります。Beginning with the simplest case, a 1D texture is defined as a single subresource, as shown in the following illustration.

1D テクスチャの図

つまり、1D テクスチャを構成するテクセルの配列は単一のサブリソースに含まれます。This means that the array of texels that make up a 1D texture are contained in a single subresource.

1D テクスチャを 3 つのミップマップ レベルで拡張した場合、それを視覚化すると次のようになります。If you expand a 1D texture with three mipmap levels, it can be visualized like this.

ミップマップ レベルを持つ 1D テクスチャの図

これを 3 つのサブテクスチャで構成される単一のテクスチャと考えます。Think of this as a single texture that is made up of three subtextures. 各サブテクスチャは 1 つのサブリソースとしてカウントされます。そのため、この 1D テクスチャには 3 つのサブリソースが含まれます。Each subtexture is counted as a subresource, so this 1D texture contains 3 subresources. サブテクスチャ (またはサブリソース) は、単一テクスチャ用の詳細レベル (LOD) を使ってインデックスを作成できます。A subtexture (or subresource) can be indexed using the level-of-detail (LOD) for a single texture. テクスチャの配列を使用する場合、特定のサブテクスチャにアクセスするには LOD とその特定のテクスチャの両方が必要です。When using an array of textures, accessing a particular subtexture requires both the LOD and the particular texture. または、API によって、この 2 つの情報を以下に示すような 0 から始まる単一のサブリソース インデックスにまとめます。Alternately, the API combines these two pieces of information into a single zero-based subresource index as shown here.

0 から始まるサブリソース インデックスの図

サブリソースの選択Selecting Subresources

API の中にはリソース全体にアクセスするものもあれば、リソースの一部にアクセスするものもあります。Some APIs access an entire resource, others access a portion of a resource. 一般的に、リソースの一部にアクセスする API は、ビュー記述を使用してアクセス対象のサブリソースを指定します。The APIs that access a portion of a resource generally use a view description to specify the subresources to access.

以下の図は、テクスチャの配列にアクセスする際にビュー記述で使用される用語を表しています。These figures illustrate the terms used by a view description when accessing an array of textures.

配列スライスArray Slice

あるテクスチャの配列で、各テクスチャにミップマップが用意されている場合、次の図に示すように、(白い長方形で表されている) 配列スライスには 1 つのテクスチャとそのすべてのサブテクスチャが含まれます。Given an array of textures, each texture with mipmaps, an array slice (represented by the white rectangle) includes one texture and all of its subtextures, as shown in the following illustration.

配列スライスの図

Mip スライスMip Slice

次の図に示すように、(白い長方形で表されている) ミップ スライスには配列内のすべてのテクスチャのミップマップ レベルが 1 つ含まれます。A mip slice (represented by the white rectangle) includes one mipmap level for every texture in an array, as shown in the following illustration.

ミップ スライスの図

1 つのサブ リソースを選択します。Selecting a Single Subresource

次の図に示すように、単一のリソースを選択するには、前述の 2 種類のスライスを使用します。You can use these two types of slices to choose a single subresource, as shown in the following illustration.

配列スライスとミップ スライスを使用してサブリソースを選択した場合の図

複数のサブリソースを選択します。Selecting Multiple Subresources

また、複数のサブリソースを選択するには、ミップマップ レベル数やテクスチャ数を指定して、前述の 2 種類のスライスを使用します。Or you can use these two types of slices with the number of mipmap levels and/or number of textures, to choose multiple subresources.

複数のサブリソースを選択した場合の図

たいていの場合、使用するテクスチャの種類、ミップマップの有無、およびテクスチャ配列の有無にかかわらず、特定のサブリソースのインデックスを計算できるように用意されたヘルパー関数があります。Regardless of what texture type you are using, with or without mipmaps, with or without a texture array, there are often helper functions provided to compute the index of a particular subresource.

強力な vs します。弱い型指定Strong vs. Weak Typing

完全に型指定されたリソースを作成すると、そのリソースの形式はそのリソースを作成したときの形式に制限されます。Creating a fully-typed resource restricts the resource to the format it was created with. これによりランタイムによるアクセスが最適化されます。特に、アプリケーションでマップできないことを示すフラグを使ってリソースを作成する場合は有効です。This enables the runtime to optimize access, especially if the resource is created with flags indicating that it cannot be mapped by the application. 型を指定して作成したリソースは、ビュー機構を使って再解釈することができません。Resources created with a specific type cannot be reinterpreted using the view mechanism.

型指定なしのリソースでは、最初にリソースを作成したときのデータ型は不明です。In a typeless resource, the data type is unknown when the resource is first created. アプリケーションは、型指定なしの利用可能な形式からいずれかを選択する必要があります。The application must choose from the available typeless formats. また、割り当てるメモリのサイズと、ランタイムでミップマップのサブテクスチャを生成する必要があるかどうかも指定しなければなりません。You must specify the size of the memory to allocate and whether the runtime will need to generate the subtextures in a mipmap.

ただし、正確なデータ形式 (整数、浮動小数点値、符号なし整数などとして、メモリが解釈されるかどうか) はビューを使ってリソースがパイプラインにバインドされるまで決定されません。However, the exact data format (whether the memory will be interpreted as integers, floating point values, unsigned integers etc.) is not determined until the resource is bound to the pipeline with a view. テクスチャ形式はテクスチャがパイプラインにバインドされるまで柔軟性が維持されるため、このリソースは弱く型指定されたストレージと呼ばれます。As the texture format remains flexible until the texture is bound to the pipeline, the resource is referred to as weakly typed storage. 弱く型指定されたストレージには、新しい形式の成分ビットが古い形式のビット数と一致している限り、(別の形式で) 再使用または再解釈できるという利点があります。Weakly typed storage has the advantage that it can be reused or reinterpreted (in another format) as long as the component bit of the new format matches the bit count of the old format.

各パイプライン ステージに、それぞれの場所での形式を完全に修飾する一意のビューがある限り、1 つのリソースを複数のパイプライン ステージにバインドすることができます。A single resource can be bound to multiple pipeline stages as long as each has a unique view, which fully qualifies the formats at each location. たとえば、型指定なし形式で作成したリソースを、パイプラインの別々の場所で FLOAT 形式および UINT 形式として同時に使用することもできます。For example, a resource created with a typeless format could be used as a FLOAT format and a UINT format at different locations in the pipeline simultaneously.

関連トピックRelated topics

リソースResources