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 は初めてなので、バイト幅を 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 に答える