本日はShader学習枠です。
表面が滑らかなガラスなどに見られるグロス表現をShaderGraphで実装します。
〇ライトの実装
ShaderGraphではいくつかあるテンプレートのうちLitのテンプレートを用いることで滑らかさ(Smoothness)があります。
しかしこれは組み込みの値のため今回はノードでグロスの表現を行っていきます。
今回はURPのShaderGraphを使用します。
①Unlitで新規のShaderGraphを作成します。
Unlitは最小限の処理になります。ここからまずはUnityのライトを受ける処理を記述します。
②CustomFunctionを作成します。
CustomFunctionノードはShaderGraphノードで提供されていない処理をhlslファイルの読み込みもしくは直接コードを入力することでノードとして作成できるノードです。
③Assets下の任意の階層にCustomLight.hlslを作成します。
CustomLight.hlslは以下のGoogleDriveで提供されています。
https://drive.google.com/file/d/1kIUCMYCDWDKvyZBz3RNSJ5QrqK4uGN9q/view
④CustomFunctionノードのグラフインスペクターウィンドウの設定を以下のように設定します。
⑤Positionノードを追加しMainLight(CustomFunction)ノードの WorldPosに接続します。
⑥NormalVectorノードを追加し、Normalizeノードをつなぎ処理した結果とMainLight(CustomFunction)ノードのDirectionをDot Productノードにつなぎます。
これによってオブジェクトの持つ法線と掛け合わせることでライトの当たり方を処理できました。ここまでの処理でLit表現が行えます。
次に本題のグロス表現を実装します。
⑦View DirectionとMainLight(CustomFunction)ノードのDirectionを足し合わせNormalizeします。
⑧Dot Productノードを追加し、⑦の出力と⑥のNormalVectorノードのNormalizeノード出力と接続します。
⑨ ⑥のDot Productノードの出力にSmoothStepノードの処理を接続します。Edgeはいずれも0.001の値を指定します。
⑩ ⑨の出力と⑧の出力をMultiplyノードで掛け合わせます。その出力をPowerノードのAへ接続します。BはPowerノードを追加します。
これによって反射面の映り込みが作成できました。
⑪Addノードを追加し ⑩の出力と⑥の出力を足しあわえます。これは通常の陰影(光の処理)とグロスの反射を足し合わせています。
以上でShaderが完成しました。
シーンで見てみるとライトが当たっている一部のみグロスの反射光が見えます。