[Unity Shader Graph]Unlitで影をつける(初心者)
Unity version 2021.3.14f1
1、Shader Graphをインストール
レンダーパイプラインがURPやHDRPの場合はすでにインストールされているのでこの工程は不要 ここではURPを使用している
メニュー >> Window >> Package Managerでウィンドウを開く
PackagesのプルダウンメニューからUnity Registryを選択
Shader Graphをインストール
2、Shader Graphを作成
Projectウィンドウで右クリックからCreate >> Shader Graph >> URP >> Unlit Shader Graph を選択してファイルを作成
Shader Graphファイルをダブルクリックするとウィンドウが開く
ウィンドウ上で右クリックからCreate NodeでNode検索ウィンドウが出てノードを作成できる
※Create NodeをクリックしてもNode検索ウィンドウが表示されない場合はShader Graphのウィンドウ上で一度左クリックしてみる
使用するノード
Color:色を出力
Add:2つの入力値を足し合わせる(加算)
Multiply:2つの入力値を掛け合わせる(乗算)
Texture 2D Asset:任意のテクスチャを出力
Sample Texture 2D:テクスチャを出力するために必要なノード
Smoothstep:範囲外の値を滑らかに切り捨て
Dot Product:入力値のドット積 (点乗積)、あるいはスカラー積 (内積) を出力(よくわかっていない)
Normal Vector:メッシュの頂点あるいはフラグメントの法線ベクトル (Normal Vector) へのアクセスを提供します、Space ドロップダウンパラメーターで出力値の座標空間を選択できます(よくわかっていない)
Vector3:3つの値をVector3型の値として出力する
Saturate:入力 In の値を 0 と 1 の間に固定して返します。
Position:ノードが属するグラフセクションで有効な シェーダステージ に応じて、メッシュの頂点あるいはフラグメントの 位置 (Position) へのアクセスを提供します。Space ドロップダウンパラメーターで、出力値の座標空間を選択できます。(よくわかっていない)
Custom Function:ファイルを参照したりノードにScriptを書いてノードを作成できる
3、CustomFunctionを作成する
テキストエディタなどで.hlslファイルを作成する
Create NodeからCustom Functionを作成する
Graph InspectorのNode SettingsでTypeをFileにする
Graph Inspectorが表示されていない場合はウィンドウ右上のGraph InspectorをクリックするNameをMainLightにする ノードの名前になる
(この名前を変更する場合はscriptの中も書き換える必要がある)Sourceに作成した.hlslファイルを設定する
Inputsを追加して名前をWorldPosにしてVector3にする
Outputsを追加して名前をDirectionにしてVector3にする
Outputsを追加して名前をShadowAttenにしてFloatにする
hlslファイルに以下を記述する
Scriptの内容に関しては理解していないので説明は割愛します
※公式のチュートリアルか何かに書いてあったのを少し書き換えたものだがどこの記事だったか探しても見つからない 見つかったら追記します
void MainLight_half(float3 WorldPos, out half3 Direction, out half ShadowAtten)
{
#ifdef SHADERGRAPH_PREVIEW
Direction = half3(0.5, 0.5, 0);
ShadowAtten = 1;
#else
#if SHADOWS_SCREEN
half4 clipPos = TransformWorldToClip(WorldPos);
half4 shadowCoord = ComputeScreenPos(clipPos);
#else
half4 shadowCoord = TransformWorldToShadowCoord(WorldPos);
#endif
Light mainLight = GetMainLight(shadowCoord);
Direction = mainLight.direction;
#if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
ShadowAtten = 1.0h;
#endif
#if SHADOWS_SCREEN
ShadowAtten = SampleScreenSpaceShadowmap(shadowCoord);
#else
ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
half4 shadowParams = GetMainLightShadowParams();
ShadowAtten = SampleShadowmap(TEXTURE2D_ARGS(_MainLightShadowmapTexture, sampler_MainLightShadowmapTexture),TransformWorldToShadowCoord(WorldPos), shadowSamplingData, shadowParams, false);
#endif
#endif
}
4、ノードを作成する
Positionノードを作成しCustomFunctionのWorldPosに繋ぐ
Normal Vectorノードを作成
Dot Productノードを作成しNormal VectorノードをAに繋ぐ
Dot ProductノードのBにCustomFunctionのDirectionを繋ぐ
Saturateノードを作成しDot Productを繋ぐ
Smoothstepノードを作成しSaturateノードをInに繋ぐ
Edgeの値で影のつき方を調整する
ここではEdge1:0, Edge2:0.02Addノードを作成しSmoothstepノードをBに繋ぐ
Colorノードを作成しAddノードのAに繋ぐ
Colorで影の濃さを調整Texture 2D Assetノードを作成しプロパティ化
Sample Texture 2Dノードを作成しTexture 2D Assetノードを繋げる
Multiplyノードを作成しSample Texture 2DノードとAddノードを繋ぐ
もう一つSmoothstepノードを作成しCustomFunctionノードのShadowAttenをInに繋ぐ
ここではEdge1:0, Edge2:1Addノードを作成しSmoothstepノードをAに繋ぐ
Floatノードを作成しAddノードのBに繋ぐ
Floatの値で影の濃さを調整Multiplyノードをもう一つ作成しMultiplyノードとAddノードを繋ぐ
MultiplyノードをFragmentのBase Colorに繋ぐ
ウィンドウ左上のSaveAssetを押す
5、マテリアルを作成
Projectウィンドウで右クリックからCreate >> Materialで必要な数だけ作成
MaterialファイルにShader Graphファイルをドラッグ&ドロップする
Materialファイルを選択しInspectorウィンドウでプロパティ化したノードのTexture2Dで任意のテクスチャを設定する
6、オブジェクトを準備
Hierarchyウィンドウで右クリック>>3D Objectから3Dモデルを作成
作成した3Dモデルを選択しInspectorウィンドウのMesh RendererのMaterialsで作成したマテリアルに変更する
説明が間違っている可能性があります自分でも調べて確認してみてください
物体から落ちる影(Cast shadows)がなぜギザギザになるのかはわからない
Settingsフォルダに入っているURP-HighFidelityのInspectorウィンドウのShadowsで項目をいじると多少調整できるがなくすことはできない
どうしたら綺麗になるんだ?
この記事が気に入ったらサポートをしてみませんか?