【Unity】Unity 6000 で KeywordEnum を利用して Shader のキーワードを外部 HLSL に記述する際の注意点
Unity 6000 以降のバージョンでは、KeywordEnum を利用して Shader のキーワード(#pragma shader_feature など)を外部 HLSL ファイルに記述する際、通常の #include を使用すると、以前のバージョンでは有効だったキーワードが Unity 6000 では無効(Invalid Keywords)になってしまう場合があります。

本記事では、この問題の原因と解決策として #include_with_pragmas を使用する方法について解説します。
問題の発生
通常、Shader のコードの再利用性を高めるため、外部の .hlsl ファイルを #include で取り込むことが一般的です。しかし、Unity 6000 以降では、KeywordEnum を利用して外部の .hlsl に #pragma shader_feature などのキーワードを記述した場合、それが正しく認識されず、無効なキーワードとして扱われてしまいます。
解決策: #include_with_pragmas を使用する
Unity 2020.3 以降のバージョンでは #include_with_pragmas の使用が推奨されていました。そして Unity 6000 では、従来の #include では #pragma shader_feature が正しく認識されず、キーワードが適用されないという問題が発生します。
したがって、外部 HLSL ファイルに #pragma 指令を記述する場合は、#include_with_pragmas を使用する必要があります。
修正例
以下のように #include_with_pragmas を使用することで、外部 HLSL 内の #pragma shader_feature が正しく認識されます。
Shader "Example/KeywordTest"
{
SubShader
{
Pass
{
HLSLPROGRAM
#include_with_pragmas "Keywords.hlsl"
ENDHLSL
}
}
}
これにより、Keywords.hlsl 内の #pragma shader_feature が正しく適用され、期待通りの動作をするようになります。
#include_with_pragmas の仕組み
#include_with_pragmas は、通常の #include と異なり、外部ファイル内の #pragma や #define などのプリプロセッサ指令を適切に処理する機能を持ちます。
特に、Shader Keywords(#pragma shader_feature や #pragma multi_compile)は、通常の #include では正しく解析されません。そのため、Unity 6000 以降では #include_with_pragmas の使用が推奨されています。
まとめ
- Unity 6000 以降では、
#includeを使用すると#pragma shader_featureが正しく認識されず、Invalid Keywordsエラーが発生する。 - Shader Keywords を外部 HLSL に記述する場合は、
#includeではなく#include_with_pragmasを使用する必要がある。 #include_with_pragmasを使用することで、外部 HLSL 内の#pragma shader_featureなどのプリプロセッサ指令が正しく処理される。
この点を踏まえ、Unity 6000 以降の Shader 開発では #include_with_pragmas を適切に活用しましょう!