夜風のMixedReality

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

Unity ShaderGraphでCustomFunctionを使用する。

本日はUnityShader枠です。

UnityではSRPプロジェクトで[ShaderGraph]が使用可能です。

[ShaderGraph]の登場によってShaderLabより低コストで学習を進めることができます。

また従来のShaderLabではいちいちコンパイルする必要がありましたが、ShaderGraphではリアルタイムで結果を出力してみることができます。

しかしながらShaderGraphのノードでは対応していない場合や、複雑な処理などを行う際大量のノードを接続すると可読性が下がることがあります。

ShaderGraphでは[CustomFunction]と呼ばれる特殊なノードが提供されており、ユーザーがカスタムしたノードを作成可能です。

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

[CustomFunction]は作成時は上図のように何もすることができません。

ノード上部の歯車マークをクリックしプロパティを開きます。

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

[Source]がデフォルトで[File]となっています。これはShaderLabでいうところの以下の処理に該当します。

#inclube UnityCG.cginc(のような外部ファイル)

つまり外部ファイルに定義した関数を使用する場合に使用します。 よく使用する関数を用意します。

この[Source]を[String]に変更します。 

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

これによってHLSLの処理を記述することができるようになります。

今回次のように処理を書いてみました。

Outa=In.x*0.5;
Outb=In.y*0;

この処理ではVector2型の変数Inのx成分に0.5を積算した値がOuta、Inのy成分に0をかけたもの(実質0)がOutbという変数代入されます。

この処理を行うためにはInという入力値とOuta,Outbという出力値が必要です。

これはCustomFunctionの[Input],[Output]に定義します。

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

これによってCustomFunctionを使用したオリジナルノードが作成できました。

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

入出力を設定したことでノードのソケットが表示されます。

結果を見てみます。

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

今回Vector2型で変数を作成、最初は1の値でしたが、Outaではグレー(0.5)、Outbでは黒(0)が出力されました。

ShaderGraphでHLSLを記述することもできたので複雑な処理も行えそうです。