Invalid const register num エラーの解決

3DCGのイメージ。

HLSL(GLSL) のコンパイル時に「Invalid const register num: ~」が表示されるとき、 現在のシェーダレベルで使用できる定数の上限数を超えてしまっています。 ここでは定数について言及していますが、定数に限らず関数の呼び出し数、変数の数にも上限があります。

上限を超えた場合には、対象の定数・変数・関数の呼び出し数を削減する必要があります。

あるいはシェーダバージョンを上げることで解決することがあります。 ただしシェーダバージョンをあげると実行できる環境が限定される可能性がある点に注意します。

Unity のビルド時に発生する場合

Unityのロゴ。

Unity のビルド時にも発生することがあります。 例えば Unity が DirectX の互換を有効にしたままビルドするとき、最新の DirectX とそれより以前の DirectX で実行できる形式でビルドされます。 エディタ上では最新の DirectX で実行されるものの、ビルド時には互換のために各上限が低く設定される、という仕組みです。

最新の環境でのみ実行できれば良い、ということであれば、Player Settings オプションを使って実行環境を限定することができます。 例えば執筆時現在で Unity が対応する最新の DirectX バージョンは 11 ですが、11 にのみ限定することができます。

高度なレンダリング機能DirectX 11 と OpenGL Core - Unity