バッファー リソースの作成 (Direct3D 10)

バッファーを作成するには、バッファーが格納するデータを定義し、初期化データを提供し、適切な使用法とバインド フラグを設定する必要があります。 テクスチャを作成するには、「 テクスチャ リソースの作成 (Direct3D 10)」を参照してください。

頂点バッファーを作成する

頂点バッファーを作成する手順は次のとおりです。

バッファーの説明を作成する

頂点バッファーを作成するときに、バッファー記述 ( 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;

この例では、バッファーの説明は、 使用量CPU アクセスおよびその他のフラグのほぼすべての既定の設定で初期化されます。 その他の設定は、リソースを頂点バッファーとしてのみ識別し、バッファーのサイズを識別する バインド フラグ 用です。

パフォーマンスのためには、使用量と CPU アクセス フラグが重要です。 これら 2 つのフラグは、リソースにアクセスする頻度、リソースを読み込むことができるメモリの種類、およびリソースにアクセスするために必要なプロセッサを決定します。 既定の使用量このリソースは頻繁に更新されません。 CPU アクセスを 0 に設定すると、CPU はリソースの読み取りまたは書き込みを行う必要はありません。 組み合わせて使用すると、リソースは CPU アクセスを必要としないため、ランタイムは GPU のパフォーマンスが最も高いメモリにリソースを読み込むことができます。

予想通り、どちらのプロセッサでも、最適なパフォーマンスといつでもアクセシビリティの間にトレードオフがあります。 たとえば、CPU アクセスがない既定の使用量は、リソースを GPU でのみ使用できることを意味します。 これには、CPU から直接アクセスできないメモリへのリソースの読み込みが含まれる場合があります。 リソースは UpdateSubresource でのみ変更できます。

バッファーの初期化データを作成する

バッファーは単なる要素のコレクションであり、1D 配列としてレイアウトされます。 その結果、システム メモリ ピッチとシステム メモリ スライス ピッチはどちらも同じです。頂点データ宣言のサイズ。 アプリケーションは、実際のリソース データへのポインターを含み、そのデータのサイズとレイアウトに関する情報を含む サブリソース記述を使用してバッファーを作成するときに、初期化データを提供できます。

不変の使用法で作成されたバッファー ( D3D10_USAGE_IMMUTABLEを参照) は、作成時に初期化する必要があります。 その他の使用フラグを使用するバッファーは、 CopyResourceCopySubresourceRegionUpdateSubresource を使用した初期化後、または 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 Interface インターフェイスを使用する場合、定数バッファーの作成、バインド、および通信のプロセスは、ID3D10Effect Interface インスタンスによって処理されることに注意してください。 その場合、 GetVariableByName などの GetVariable メソッドの 1 つを使用して効果から変数を取得し、 SetMatrix などの SetVariable メソッドのいずれかで変数を更新するだけで済みます。 ID3D10Effect インターフェイスを使用して定数バッファーを管理する例については、「チュートリアル 7: テクスチャ マッピングと定数バッファー」を参照してください。

リソース (Direct3D 10)