バッファー リソースの作成 (Direct3D 10)
バッファーを作成するには、バッファーが格納するデータを定義し、初期化データを提供し、適切な使用法とバインド フラグを設定する必要があります。 テクスチャを作成するには、「 テクスチャ リソースの作成 (Direct3D 10)」を参照してください。
頂点バッファーを作成する
vertex バッファーを作成する手順は次のとおりです。
バッファーの説明を作成する
頂点バッファーを作成するときに、バッファー記述 ( D3D10_BUFFER_DESCを参照) を使用して、バッファー内でのデータの編成方法、パイプラインによるバッファーへのアクセス方法、バッファーの使用方法を定義します。
次の例では、位置と色の値を含む頂点を持つ単一の三角形のバッファー記述を作成する方法を示します。
struct SimpleVertex
{
D3DXVECTOR3 Position;
D3DXVECTOR3 Color;
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertex ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
この例では、バッファー記述は、 usage、 CPU アクセス および miscellaneous フラグのほぼすべての既定の設定で初期化されます。 その他の設定は、リソースを頂点バッファーとしてのみ識別しバッファーのサイズのみを識別する bind フラグ用です。
パフォーマンスには、使用率と CPU アクセス フラグが重要です。 これら 2 つのフラグによって、リソースにアクセスする頻度、リソースを読み込むことができるメモリの種類、リソースにアクセスするために必要なプロセッサが決まります。 既定の使用状況では、このリソースは頻繁に更新されません。 CPU アクセスを 0 に設定すると、CPU はリソースの読み取りまたは書き込みを行う必要はありません。 組み合わせて使用すると、リソースは CPU アクセスを必要としないため、ランタイムは GPU のパフォーマンスが最も高いメモリにリソースを読み込むことができます。
予想どおり、どちらのプロセッサでも、最適なパフォーマンスと任意の時間のアクセシビリティの間にトレードオフがあります。 たとえば、CPU アクセスのない既定の使用量は、リソースを GPU でのみ使用できることを意味します。 これには、CPU から直接アクセスできないメモリへのリソースの読み込みが含まれる場合があります。 リソースは、 UpdateSubresourceでのみ変更できます。
バッファーの初期化データを作成する
バッファーは単なる要素のコレクションであり、1D 配列としてレイアウトされます。 その結果、システム メモリ ピッチとシステム メモリ スライス ピッチはどちらも同じです。頂点データ宣言のサイズ。 アプリケーションは、実際のリソース データへのポインターを含み、そのデータのサイズとレイアウトに関する情報を含む subresource description を使用してバッファーを作成するときに初期化データを提供できます。
不変の使用法で作成されたバッファー ( D3D10_USAGE_IMMUTABLEを参照) は、作成時に初期化する必要があります。 その他の使用フラグを使用するバッファーは、 CopyResource、 CopySubresourceRegion、 UpdateSubresource を使用して初期化した後、または Map メソッドを使用して基になるメモリにアクセスすることで更新できます。
バッファーを作成する
バッファーの説明と初期化データ (省略可能) を使用して CreateBuffer を呼び出して頂点バッファーを作成します。 次のコード スニペットは、アプリケーションによって宣言された頂点データの配列から頂点バッファーを作成する方法を示しています。
struct SimpleVertexCombined
{
D3DXVECTOR3 Pos;
D3DXVECTOR3 Col;
};
ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer* g_pVertexBuffer[2] = { NULL, NULL };
ID3D10Buffer* g_pIndexBuffer = NULL;
SimpleVertexCombined verticesCombo[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.5f, 0.0f ),
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer[0] );
インデックス バッファーを作成する
インデックス バッファーの作成は、頂点バッファーの作成とよく似ています。2 つの違いがあります。 インデックス バッファーには、頂点バッファーで使用できる幅広い形式ではなく、16 ビットまたは 32 ビットのデータのみが含まれます。 インデックス バッファーには、インデックス バッファー バインド フラグも必要です。
次の例では、インデックス データの配列からインデックス バッファーを作成する方法を示します。
ID3D10Buffer *g_pIndexBuffer = NULL;
// Create indices
unsigned int indices[] = { 0, 1, 2 };
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( unsigned int ) * 3;
bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = indices;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pIndexBuffer );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
定数バッファーを作成する
Direct3D 10 には定数バッファーが導入されています。 定数バッファー (シェーダー定数バッファー) は、シェーダー定数を含むバッファーです。 HLSLWithoutFX10 サンプルから取得した定数バッファーを作成する例を次に示します。
ID3D10Buffer* g_pConstantBuffer10 = NULL;
struct VS_CONSTANT_BUFFER
{
D3DXMATRIX mWorldViewProj; //mWorldViewProj will probably be global to all shaders in a project.
//It's a good idea not to move it around between shaders.
D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime; //fTime may also be global to all shaders in a project.
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
};
D3D10_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D10_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer10 );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->VSSetConstantBuffers( 0, 1, g_pConstantBuffer10 );
ID3D10Effect インターフェイスを使用する場合定数バッファーの作成、バインド、および結合のプロセスは、ID3D10Effect Interface インスタンスによって処理されることに注意してください。 その場合は、 GetVariableByName などの GetVariable メソッドのいずれかを使用して効果から変数を取得し SetMatrix などの SetVariable メソッドのいずれかで変数を更新するだけで済みます。 ID3D10Effect Interface を使用して定数バッファーを管理する例については、「Tutorial 7: テクスチャ マッピングと定数バッファーを参照してください。
関連トピック