我编写了这个函数,以便在一个函数调用中执行所有必要的步骤来创建一个常量缓冲区。
template <typename T>
ID3D11Buffer* Engine::CreateCBuffer(T &src,ENGINE_DATA &data, int registerV)
{
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.ByteWidth = sizeof(T);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.StructureByteStride = 0;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bd.MiscFlags = 0;
// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA subrsrc;
subrsrc.pSysMem = &src;
subrsrc.SysMemPitch = 0;
subrsrc.SysMemSlicePitch = 0;
ID3D11Buffer* pBuffer;
data.device->CreateBuffer(&bd, &subrsrc, &pBuffer);
data.devContext->VSSetConstantBuffers(registerV, 1, &pBuffer);
return pBuffer;
}
我已经用它将trnsformation / view / projection矩阵传递给顶点缓冲区。 现在我试图在另一个常量缓冲区中传递一个亮位置。
//code for matrices buffer
renderer.getObject(0)->setTMBuffer(
CeateCBuffer(renderer.getObject(0)->getTransformationMatrix()->transformationMatrix, data, 1));
//code for light position buffer
lBuffer = CreateCBuffer(light.direction, data, 0);
在这两种情况下,所有变量都被正确声明并初始化。
这是相对于这些缓冲区的着色器代码部分。
cbuffer LIGHT : register (b0)
{
float3 light_direction;
};
cbuffer TRANSFORMATION_MATRIX : register (b1)
{
float4x4 transformationMatrix;
};
我不明白为什么当我尝试创建灯光位置缓冲区时,函数CreateBuffer会返回错误87(无效参数)。