方法: 定数バッファーを作成する
定数バッファー には、シェーダー定数データが含まれています。 このトピックでは、レンダリングの準備として 定数バッファー を初期化する方法について説明します。
定数バッファーを初期化するには
頂点シェーダー定数データを記述する構造体を定義します。
手順 1 で定義した構造体にメモリを割り当てます。 このバッファーに頂点シェーダー定数データを入力します。 malloc または new を使用してメモリを割り当てたり、スタックから構造体のメモリを割り当てたりすることができます。
D3D11_BUFFER_DESC構造体を入力してバッファーの説明を作成します。 D3D11_BIND_CONSTANT_BUFFER フラグを BindFlags メンバーに渡し、定数バッファー記述構造体のサイズをバイト単位で ByteWidth メンバーに渡します。
注意
D3D11_BIND_CONSTANT_BUFFER フラグを他のフラグと組み合わせることはできません。
D3D11_SUBRESOURCE_DATA構造体を入力して、サブリソース データの説明を作成します。 D3D11_SUBRESOURCE_DATA構造体の pSysMem メンバーは、手順 2 で作成した頂点シェーダー定数データを直接指す必要があります。
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 がメモリ内のレイアウトを処理する方法については、「 定数変数のパッキング規則」を参照してください。
関連トピック