試した環境
- Windows10
本題
Direct3D 11 のシェーダーで定数を扱う際に用意する Constant Buffer ですが、 このバッファサイズは16の倍数にしなければなりません。 このことは D3D11_BUFFER_DESC 構造体のリファレンスページに載っています。
D3D11_BUFFER_DESC (d3d11.h) - Win32 apps | Microsoft Docs
If the bind flag is D3D11_BIND_CONSTANT_BUFFER, you must set the ByteWidth value in multiples of 16, and less than or equal to D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT.
D3D11_BUFFER_DESC 構造体の ByteWidth に指定する値を16の倍数にすればいいようなので、 Constant Buffer を表す構造体が16の倍数のサイズでなくてもいいみたいです。 そのときは ByteWidth を構造体サイズより大きい16の倍数にすればいいみたいです。
余談
もしかしたら Direct3D 11 を使う人にとっては当たり前のことなのかもしれませんが、
最近 Direct3D 11 に初めて触れた私は気づかずにはまりました。
How to: Create a Constant Buffer ではそのことに触れておらず、 Constant Buffer でプログラムが動かなくなる原因を見つけるのに苦労しました。
頂点バッファやインデックスバッファでも使用する D3D11_BUFFER_DESC 構造体のリファレンスページに情報があるというのは盲点でした。