うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【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 を適切に活用しましょう!