見出し画像

[Unity Shader Graph]Unlitで影をつける(初心者)

Unity version 2021.3.14f1

Shader Graph

1、Shader Graphをインストール

レンダーパイプラインがURPやHDRPの場合はすでにインストールされているのでこの工程は不要 ここではURPを使用している

  1. メニュー >> Window >> Package Managerでウィンドウを開く

  2. PackagesのプルダウンメニューからUnity Registryを選択

  3. 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を作成する

  1. テキストエディタなどで.hlslファイルを作成する

  2. Create NodeからCustom Functionを作成する

  3. Graph InspectorのNode SettingsでTypeをFileにする
    Graph Inspectorが表示されていない場合はウィンドウ右上のGraph Inspectorをクリックする

  4. NameをMainLightにする ノードの名前になる
    (この名前を変更する場合はscriptの中も書き換える必要がある)

  5. Sourceに作成した.hlslファイルを設定する

  6. Inputsを追加して名前をWorldPosにしてVector3にする

  7. Outputsを追加して名前をDirectionにしてVector3にする

  8. Outputsを追加して名前をShadowAttenにしてFloatにする

  9. 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、ノードを作成する

  1. Positionノードを作成しCustomFunctionのWorldPosに繋ぐ

  2. Normal Vectorノードを作成

  3. Dot Productノードを作成しNormal VectorノードをAに繋ぐ

  4. Dot ProductノードのBにCustomFunctionのDirectionを繋ぐ

  5. Saturateノードを作成しDot Productを繋ぐ

  6. Smoothstepノードを作成しSaturateノードをInに繋ぐ
    Edgeの値で影のつき方を調整する
    ここではEdge1:0, Edge2:0.02

  7. Addノードを作成しSmoothstepノードをBに繋ぐ

  8. Colorノードを作成しAddノードのAに繋ぐ
    Colorで影の濃さを調整

  9. Texture 2D Assetノードを作成しプロパティ化

  10. Sample Texture 2Dノードを作成しTexture 2D Assetノードを繋げる

  11. Multiplyノードを作成しSample Texture 2DノードとAddノードを繋ぐ

  12. もう一つSmoothstepノードを作成しCustomFunctionノードのShadowAttenをInに繋ぐ
    ここではEdge1:0, Edge2:1

  13. Addノードを作成しSmoothstepノードをAに繋ぐ

  14. Floatノードを作成しAddノードのBに繋ぐ
    Floatの値で影の濃さを調整

  15. Multiplyノードをもう一つ作成しMultiplyノードとAddノードを繋ぐ

  16. MultiplyノードをFragmentのBase Colorに繋ぐ

  17. ウィンドウ左上のSaveAssetを押す

5、マテリアルを作成

  1. Projectウィンドウで右クリックからCreate >> Materialで必要な数だけ作成

  2. MaterialファイルにShader Graphファイルをドラッグ&ドロップする

  3. Materialファイルを選択しInspectorウィンドウでプロパティ化したノードのTexture2Dで任意のテクスチャを設定する

6、オブジェクトを準備

  1. Hierarchyウィンドウで右クリック>>3D Objectから3Dモデルを作成

  2. 作成した3Dモデルを選択しInspectorウィンドウのMesh RendererのMaterialsで作成したマテリアルに変更する

説明が間違っている可能性があります自分でも調べて確認してみてください

物体から落ちる影(Cast shadows)がなぜギザギザになるのかはわからない
Settingsフォルダに入っているURP-HighFidelityのInspectorウィンドウのShadowsで項目をいじると多少調整できるがなくすことはできない
どうしたら綺麗になるんだ?

この記事が気に入ったらサポートをしてみませんか?