方法:定数バッファーの作成
定数バッファーには、シェーダー定数データが格納されます。ここでは、レンダリングの準備のために定数バッファーを初期化する方法について説明します。
定数バッファーを初期化するには
定数データを記述する構造体を定義します。
D3D11_BUFFER_DESC 構造体に値を競って値して、バッファーの記述を作成します。D3D11_BIND_CONSTANT_BUFFER フラグを BindFlags メンバーに渡し、この定数バッファーを記述した構造体のサイズ (バイト) を ByteWidth メンバーに渡します。
D3D11_BIND_CONSTANT_BUFFER フラグを他のフラグと組み合わせて使用することはできません。
D3D11_BUFFER_DESC 構造体、D3D11_SUBRESOURCE_DATA 構造体、および初期化する ID3D11Buffer インターフェイスのポインターのアドレスを指定して、ID3D11Device::CreateBuffer を呼び出します。
次のコード例は、定数バッファーを作成する方法を示しています。この例では、g_pd3dDevice が有効な ID3D11Device オブジェクトであり、g_pd3dContext が有効な ID3D11DeviceContext オブジェクトであることを前提としています。
ID3D11Buffer* g_pConstantBuffer11 = NULL; // Define the constant data used to communicate with shaders. struct VS_CONSTANT_BUFFER { D3DXMATRIX mWorldViewProj; D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader; float fSomeFloatThatMayBeNeededByASpecificShader; float fTime; float fSomeFloatThatMayBeNeededByASpecificShader2; float fSomeFloatThatMayBeNeededByASpecificShader3; }; // 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; // Create the buffer. hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer11 ); if( FAILED( hr ) ) return hr; // Set the buffer. g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer11 );