晚上好
我正在尝试将 XMFLOAT3X3 发送到常量缓冲区(请参阅下面的代码)。
ZeroMemory(&constDesc, sizeof(constDesc));
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constDesc.ByteWidth = sizeof(XMFLOAT3X3);
constDesc.Usage = D3D11_USAGE_DEFAULT;
result = m_pDevice->CreateBuffer(&constDesc,0,&m_pTexTransformCB);
if (FAILED(result)) {
MessageBoxA(NULL,"Error creating constant buffer m_pTexTransformCB", "Error", MB_OK);
return false;
}
但是编译器告诉我 XMFLOAT3X3 是常量缓冲区字节宽度的无效维度:
D3D11: ERROR: ID3D11Device::CreateBuffer: The Dimensions are invalid. For ConstantBuffers, marked with the D3D11_BIND_CONSTANT_BUFFER BindFlag, the ByteWidth (value = 36) must be a multiple of 16 and be less than or equal to 65536. [ STATE_CREATION ERROR #66: CREATEBUFFER_INVALIDDIMENSIONS ]
但是,我是 HLSL 的新手,所以我不确定如果我将字节宽度设置为 48,着色器的 cbuffer 中的 float3x3 是否会正确注册。我应该如何最好地处理这个问题?
如果您需要更多信息,请发表评论,我会编辑问题。我希望它足够清楚。
最佳答案
在您的情况下,您只需将 ByteWidth 更改为 48 就可以了。如果您想将多个值组合在一起,您将需要确保您的数据与 16 字节边界对齐。为此,您只需在定义结构之前添加 __declspec(align(16)) 即可。
__declspec(align(16))
struct Data
{
XMFLOAT3X3 a;
//other stuff here
};
这样您就可以使用 sizeof(Data) 并确保您的 ByteWidth 有效。很抱歉之前给你一个错误的答案,你不需要手动填充。
关于c++ - 如何创建具有有效维度的常量缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7521222/