Как создать постоянный буфер с допустимым размером

Добрый вечер,

Я пытаюсь отправить 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, float3x3 в cbuffer шейдера зарегистрируется правильно. Как я должен справиться с этим лучше всего?

Если вам нужна дополнительная информация, прокомментируйте, и я отредактирую вопрос. Я надеюсь, что это достаточно ясно.


person xcrypt    schedule 22.09.2011    source источник


Ответы (2)


В вашем случае вы можете просто изменить ByteWidth на 48, и все будет в порядке. Если вы хотите сгруппировать более одного значения вместе, вам нужно убедиться, что ваши данные выровнены по границам 16 байт. Для этого вы можете просто добавить __declspec(align(16)) перед определением своих структур.

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

    //other stuff here
};

Таким образом, вы можете использовать sizeof(Data) и быть уверенным, что ваш ByteWidth будет действительным. Приношу свои извинения за неверный ответ ранее, не нужно вручную набивать.

person Patrick Lafferty    schedule 23.09.2011

«Если установлен флаг привязки D3D11_BIND_CONSTANT_BUFFER, необходимо установить значение ByteWidth, кратное 16»
См. MSDN , особенно комментарии.

person Bos    schedule 18.11.2013