本日はShader枠です。
UnityのSRP(Scriptable Render Pipeline)ではShaderGraphの機能を使用することでコードを記述することなくノードベースでShaderを構築できます。
今回はShaderGraphの中でUnityのDirectionalLightを扱う仕組みを作ります。
〇Light.HLSL
URPのShaderでは[Lighting.hlsl]で定義されるファイルの関数[GetMainLight()]によってUnityのライト情報を取得します。
ShaderLabでのコードでのライトを扱うShaderに関しては以前の記事を参考にしてください。
〇ShaderGraphでライトを取得する。
[ShaderGraph]では作成するタイミングでいくつかのテンプレートを選択することができます。
この中で[Lit Shader Graph]を選択することでLitの名の通りライトの影響を受けるShaderGraphを作成することができます。
今回もっと詳細にライトを扱いたいため[Unlit Shader Graph]のテンプレートから作成します。
[Unlit Shader Graph]ではその名の通り光の影響を考慮しない設定となっているため当然ライト情報を受け取る処理はありません。
この [Unlit Shader Graph]にノードを追加しLitなシェーダーにしていきます。
もともとLitなテンプレートが提供されているにも関わらずにUnlitテンプレートからノードで作成する理由としては、ToonShaderのように光の当たり方と影の付き方をカスタマイズするためです。
〇Lightを用いるノードの作成
ShaderGraphでデフォルトで作成できるノードにはLightのインプットがありますが、ここでDirectionalLightを取得することはできません。
そのため[CustomFunction]のノードを作成し自作のノードを作成します。
[CustomFunction]はShaderGraphで提供されていないノードを自作のコードを記述して作成するというノードです。
タブ上部の[GraphInspector]を開きインスペクターを表示し[Type]を[String]に切り替えます。
この変更でコードを入力できるようになります。
[Name]には[Light]、[Body]には以下のコードを入力します。
#ifdef SHADERGRAPH_PREVIEW Direction = half3(0.5, 0.5, 0); Color = 1; #else Light light = GetMainLight(); Direction = light.direction; Color = light.color; #endif
ここではShaederGraphのプレビュー画面上ではライトを反映することができないのでプレビュー画面、実際の処理でプリプロセッサによりコンパイル分岐を行っています。
Unity2020以前のバージョンでは
#if SHADERGRAPH_PREVIEW←ここ Direction = half3(0.5, 0.5, 0); Color = 1; #else Light light = GetMainLight(); Direction = light.direction; Color = light.color; #endif
となっていますが、新しいバージョンでは#ifdefを用いる必要があります。
これによってライト情報を取得することができるようになります。Colorなどほかの処理をつなぐことでUnlitShaderでLitを使用することができるようになります。
以上でShaderGraphでLightを使用できるようになりました。