夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ShaderGraphでLightを使用する。

本日はShader枠です。

 UnityのSRP(Scriptable Render Pipeline)ではShaderGraphの機能を使用することでコードを記述することなくノードベースでShaderを構築できます。

 今回はShaderGraphの中でUnityのDirectionalLightを扱う仕組みを作ります。

〇Light.HLSL

 URPのShaderでは[Lighting.hlsl]で定義されるファイルの関数[GetMainLight()]によってUnityのライト情報を取得します。

f:id:Holomoto-Sumire:20210815181309j:plain

 ShaderLabでのコードでのライトを扱うShaderに関しては以前の記事を参考にしてください。

redhologerbera.hatenablog.com

〇ShaderGraphでライトを取得する。

[ShaderGraph]では作成するタイミングでいくつかのテンプレートを選択することができます。

f:id:Holomoto-Sumire:20210815181536j:plain

 この中で[Lit Shader Graph]を選択することでLitの名の通りライトの影響を受けるShaderGraphを作成することができます。

 今回もっと詳細にライトを扱いたいため[Unlit Shader Graph]のテンプレートから作成します。

[Unlit Shader Graph]ではその名の通り光の影響を考慮しない設定となっているため当然ライト情報を受け取る処理はありません。

 f:id:Holomoto-Sumire:20210815182022j:plain

 この [Unlit Shader Graph]にノードを追加しLitなシェーダーにしていきます。

 もともとLitなテンプレートが提供されているにも関わらずにUnlitテンプレートからノードで作成する理由としては、ToonShaderのように光の当たり方と影の付き方をカスタマイズするためです。

〇Lightを用いるノードの作成

ShaderGraphでデフォルトで作成できるノードにはLightのインプットがありますが、ここでDirectionalLightを取得することはできません。

 f:id:Holomoto-Sumire:20210815182621j:plain

そのため[CustomFunction]のノードを作成し自作のノードを作成します。

f:id:Holomoto-Sumire:20210815192322j:plain

[CustomFunction]はShaderGraphで提供されていないノードを自作のコードを記述して作成するというノードです。

redhologerbera.hatenablog.com

タブ上部の[GraphInspector]を開きインスペクターを表示し[Type]を[String]に切り替えます。

f:id:Holomoto-Sumire:20210815193305j:plain

この変更でコードを入力できるようになります。

[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

www.bing.com

となっていますが、新しいバージョンでは#ifdefを用いる必要があります。

これによってライト情報を取得することができるようになります。Colorなどほかの処理をつなぐことでUnlitShaderでLitを使用することができるようになります。

f:id:Holomoto-Sumire:20210815194501j:plain

以上でShaderGraphでLightを使用できるようになりました。

f:id:Holomoto-Sumire:20210815194606j:plain