方法: 定数バッファーを作成する

定数バッファー には、シェーダー定数データが含まれています。 このトピックでは、レンダリングの準備として 定数バッファー を初期化する方法について説明します。

定数バッファーを初期化するには

  1. 頂点シェーダー定数データを記述する構造体を定義します。

  2. 手順 1 で定義した構造体にメモリを割り当てます。 このバッファーに頂点シェーダー定数データを入力します。 malloc または new を使用してメモリを割り当てたり、スタックから構造体のメモリを割り当てたりすることができます。

  3. D3D11_BUFFER_DESC構造体を入力してバッファーの説明を作成します。 D3D11_BIND_CONSTANT_BUFFER フラグを BindFlags メンバーに渡し、定数バッファー記述構造体のサイズをバイト単位で ByteWidth メンバーに渡します。

    注意

    D3D11_BIND_CONSTANT_BUFFER フラグを他のフラグと組み合わせることはできません。

     

  4. D3D11_SUBRESOURCE_DATA構造体を入力して、サブリソース データの説明を作成します。 D3D11_SUBRESOURCE_DATA構造体の pSysMem メンバーは、手順 2 で作成した頂点シェーダー定数データを直接指す必要があります。

  5. ID3D11Device::CreateBuffer を呼び出し、D3D11_BUFFER_DESC構造体、D3D11_SUBRESOURCE_DATA構造体、および初期化する ID3D11Buffer インターフェイスへのポインターのアドレスを渡します。

これらのコード例では、定数バッファーを作成する方法を示します。

この例では 、g_pd3dDevice が有効な ID3D11Device オブジェクトであり、 g_pd3dContext が有効な ID3D11DeviceContext オブジェクトであることを前提としています。

ID3D11Buffer*   g_pConstantBuffer11 = NULL;

// Define the constant data used to communicate with shaders.
struct VS_CONSTANT_BUFFER
{
    XMFLOAT4X4 mWorldViewProj;                              
    XMFLOAT4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;                                            
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
} VS_CONSTANT_BUFFER;

// Supply the vertex shader constant data.
VS_CONSTANT_BUFFER VsConstData;
VsConstData.mWorldViewProj = {...};
VsConstData.vSomeVectorThatMayBeNeededByASpecificShader = XMFLOAT4(1,2,3,4);
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader = 3.0f;
VsConstData.fTime = 1.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader2 = 2.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader3 = 4.0f;

// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = &VsConstData;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;

// Create the buffer.
hr = g_pd3dDevice->CreateBuffer( &cbDesc, &InitData, 
                                 &g_pConstantBuffer11 );

if( FAILED( hr ) )
   return hr;

// Set the buffer.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer11 );
    

この例では、関連付けられている HLSL cbuffer 定義を示します。

cbuffer VS_CONSTANT_BUFFER : register(b0)
{
    matrix mWorldViewProj;
    float4  vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};

注意

C++ の VS_CONSTANT_BUFFER メモリ レイアウトと HLSL レイアウトが一致していることを確認します。 HLSL がメモリ内のレイアウトを処理する方法については、「 定数変数のパッキング規則」を参照してください。

 

Buffers

Direct3D 11 の使用方法