デコシノニッキ

ホロレンジャーの戦いの記録

独習ShaderGraph その10 ランバード拡散照明モデル

前回
www.tattichan.work

今回
nn-hokuson.hatenablog.com

この自己学習期間中にShaderGraphがアップデートしました。(β版だからね…)ですので、Propertyなど一部変更が入っています。
www.tattichan.work

ランバード拡散照明モデル
Shader "Custom/SimpleLambert" {

	SubShader{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
#pragma surface surf SimpleLambert
#pragma target 3.0


		struct Input {
		float2 uv_MainTex;
	};


	void surf(Input IN, inout SurfaceOutput  o) {
		o.Albedo = fixed4(1,1,1,1);
	}

	half4 LightingSimpleLambert(SurfaceOutput s, half3 lightDir, half atten)
	{
		//光の向きとオブジェクトの法線方向で内積をとる
		//1(平行)なほど明るくなる
		//0(垂直)以下は影になる部分
		half NdotL = max(0, dot(s.Normal, lightDir));
		half4 c;
		//そのままだと影部分が描画されないため、環境光で下駄をはかせてやる
		c.rgb = s.Albedo * _LightColor0.rgb * NdotL + fixed4(0.2f, 0.2f, 0.2f, 1);
		c.a = s.Alpha;
		return c;
	}
	ENDCG
	}
		FallBack "Diffuse"
}

f:id:haikage1755:20180210185331p:plain:w250

ランバード拡散照明のノード

f:id:haikage1755:20180217212542p:plain:w350

ShaderForgeのようなLightDirectionをもたないため、自分で光の向きを計算してやる必要があります。
Transform.Rotationが(0,0,0)のとき、ライトの向きはz方向が前になります。つまり単位ベクトルは(0,0,1)ですね。このベクトルに対して、Transform.Rotationの値を考慮してベクトルを回転させてやります。

回転行列 - Wikipedia

LightDirectionには(50,-30,0)とDirectionlLightの標準の向きを入れてあります。このままでは使えないので、DegreesToRadiansで、角度からラジアンに変換してやります。

f:id:haikage1755:20180217212642p:plain:w250

Splitで各要素を取り出し、sin、cosを求めてやります。カラー用で使うノードだとは思うのですが他にやりようもなさそうなので…
ここで先ほどのベクトルの回転の話が登場します。左手系ではz-x-yの順で回転させてやります。
(0,0,1)をx軸周りにα、y軸周りにβ、z軸周りにγで回すと、(cosα sinβ、-sinα、cosα cosβ)になるかと思います。
参考 WebGL2入門 3D知識編

f:id:haikage1755:20180217212706p:plain:w250

ライトの向きベクトルについてですが、どうやら-transform.fowardの向きらしく、最後に-1を全体にかけて反転処理をしています。

あとはいつも通り内積をもとめ、Maximumノードで範囲を限定してやります。
次にオブジェクトの色を反映しましょう。白色にライトのカラー(255,244,214)を混ぜ合わせ、さっき求めた影の当たり方を掛け合わせます。
f:id:haikage1755:20180210200558p:plain:w250
最後にFixedValue(0.2,0.2,0.2,1)を足し合わせ、Albedoに適応したら完成です。

f:id:haikage1755:20180210200747p:plain:w250

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」