3

晚上好,

我正在尝试将 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 有点陌生,所以我不确定是否将 bytewidth 设置为 48,着色器的 cbuffer 中的 float3x3 是否会正确注册。我应该如何最好地处理这个?

如果您需要更多信息,请发表评论,我将编辑问题。我希望它足够清楚。

4

2 回答 2

6

在您的情况下,您只需将 ByteWidth 更改为 48 就可以了。如果要将多个值组合在一起,则需要确保数据与 16 字节边界对齐。为此,您可以在定义结构之前添加 __declspec(align(16))。

__declspec(align(16))
struct Data
{
    XMFLOAT3X3 a;

    //other stuff here
};

这样您就可以使用 sizeof(Data) 并保证您的 ByteWidth 有效。很抱歉之前给你一个错误的答案,你不需要手动填充。

于 2011-09-23T00:18:23.880 回答
3

“如果绑定标志为 D3D11_BIND_CONSTANT_BUFFER,则必须将 ByteWidth 值设置为 16 的倍数”<br> 请参阅MSDN ,尤其是备注。

于 2013-11-18T01:57:49.097 回答