一、定义用于与着色器通信的常量数据
ID3D11Buffer* g_pConstantBuffer11 = nullptr;
// define
struct VS_CONSTANT_BUFFER
{
XMFLOAT4X4 mWOrldViewProj;
XMFLOAT4 vSomeVectorTharMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime;
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
}VS_CONSTANT_BUFFER;
二、给定义的结构分配内存(可以在堆上也可以在栈)
// Allocate
VS_CONSTANT_BUFFER VsConstData;
VsConstData.mWOrldViewProj = {...};
VsConstData.vSomeVectorTharMayBeNeededByASpecificShader = XMFLOAT4(1,2,3,4);
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader = 3.0f;
VsConstData.fTime = 1.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader2 = 2.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader4 = 4.0f;
三、初始化D3D11_BUFFER_DESC,BindFlags传递D3D11_BIND_CONSTANT_BUFFER // 注:D3D11_BIND_CONSTANT_BUFFER不能与任何其他flag组合
// init
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.ByteWidth = sizeof(VS_CONSTANT_BUFFER)
bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; // 注意这个参数
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
四、填充D3D11_SUBRESOURCE_DATA, pSysMem 传递shader数据
// init
D3D11_SUBRESOURCE_DATA Initdata;
InitData.pSysMem = &VsConstData;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
五、ID3D11Device :: CreateBuffer 创建buffer
// creatBuffer
hr = g_pd3dDevice->CreateBuffer(&bufferDesc, &InitData, &g_pConstantBuffer11);
if(FAILED(hr))
{
return hr;
}
// set buffer
g_pd3dDevice->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;
};