夜風のMixedReality

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

ShaderGraphでグロス表現を行う

本日はShader学習枠です。

表面が滑らかなガラスなどに見られるグロス表現をShaderGraphで実装します。

〇ライトの実装

ShaderGraphではいくつかあるテンプレートのうちLitのテンプレートを用いることで滑らかさ(Smoothness)があります。

f:id:Holomoto-Sumire:20220305212658p:plain

しかしこれは組み込みの値のため今回はノードでグロスの表現を行っていきます。

今回はURPのShaderGraphを使用します。

Unlitで新規のShaderGraphを作成します。

f:id:Holomoto-Sumire:20220305212840p:plain

Unlitは最小限の処理になります。ここからまずはUnityのライトを受ける処理を記述します。

CustomFunctionを作成します。

f:id:Holomoto-Sumire:20220305212949p:plain

CustomFunctionノードはShaderGraphノードで提供されていない処理をhlslファイルの読み込みもしくは直接コードを入力することでノードとして作成できるノードです。

③Assets下の任意の階層にCustomLight.hlslを作成します。

CustomLight.hlslは以下のGoogleDriveで提供されています。

https://drive.google.com/file/d/1kIUCMYCDWDKvyZBz3RNSJ5QrqK4uGN9q/view

CustomFunctionノードのグラフインスペクターウィンドウの設定を以下のように設定します。

f:id:Holomoto-Sumire:20220305214005p:plain

Positionノードを追加しMainLight(CustomFunction)ノードの WorldPosに接続します。

f:id:Holomoto-Sumire:20220305214122p:plain

NormalVectorノードを追加し、Normalizeノードをつなぎ処理した結果とMainLight(CustomFunction)ノードのDirectionDot Productノードにつなぎます。

f:id:Holomoto-Sumire:20220305215834p:plain

これによってオブジェクトの持つ法線と掛け合わせることでライトの当たり方を処理できました。ここまでの処理でLit表現が行えます。

f:id:Holomoto-Sumire:20220305215956p:plain

次に本題のグロス表現を実装します。

View DirectionMainLight(CustomFunction)ノードのDirectionを足し合わせNormalizeします。

f:id:Holomoto-Sumire:20220305220709p:plain

Dot Productノードを追加し、⑦の出力と⑥のNormalVectorノードのNormalizeノード出力と接続します。

f:id:Holomoto-Sumire:20220305221353p:plain

⑨ ⑥のDot Productノードの出力にSmoothStepノードの処理を接続します。Edgeはいずれも0.001の値を指定します。

f:id:Holomoto-Sumire:20220305222159p:plain

⑩ ⑨の出力と⑧の出力をMultiplyノードで掛け合わせます。その出力をPowerノードのAへ接続します。BはPowerノードを追加します。

f:id:Holomoto-Sumire:20220305222531p:plain

これによって反射面の映り込みが作成できました。

Addノードを追加し ⑩の出力と⑥の出力を足しあわえます。これは通常の陰影(光の処理)とグロスの反射を足し合わせています。

f:id:Holomoto-Sumire:20220305222712p:plain

以上でShaderが完成しました。

シーンで見てみるとライトが当たっている一部のみグロスの反射光が見えます。

f:id:Holomoto-Sumire:20220305222032p:plain