Direct3D 11(DirectX 11) の Constant Buffer のバッファサイズは16の倍数にしなければならない

試した環境

  • 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 構造体のリファレンスページに情報があるというのは盲点でした。

参考(再掲)

docs.microsoft.com