この自己学習期間中に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" }
ランバード拡散照明のノード
ShaderForgeのようなLightDirectionをもたないため、自分で光の向きを計算してやる必要があります。
Transform.Rotationが(0,0,0)のとき、ライトの向きはz方向が前になります。つまり単位ベクトルは(0,0,1)ですね。このベクトルに対して、Transform.Rotationの値を考慮してベクトルを回転させてやります。
LightDirectionには(50,-30,0)とDirectionlLightの標準の向きを入れてあります。このままでは使えないので、DegreesToRadiansで、角度からラジアンに変換してやります。
Splitで各要素を取り出し、sin、cosを求めてやります。カラー用で使うノードだとは思うのですが他にやりようもなさそうなので…
ここで先ほどのベクトルの回転の話が登場します。左手系ではz-x-yの順で回転させてやります。
(0,0,1)をx軸周りにα、y軸周りにβ、z軸周りにγで回すと、(cosα sinβ、-sinα、cosα cosβ)になるかと思います。
参考 WebGL2入門 3D知識編
ライトの向きベクトルについてですが、どうやら-transform.fowardの向きらしく、最後に-1を全体にかけて反転処理をしています。
あとはいつも通り内積をもとめ、Maximumノードで範囲を限定してやります。
次にオブジェクトの色を反映しましょう。白色にライトのカラー(255,244,214)を混ぜ合わせ、さっき求めた影の当たり方を掛け合わせます。
最後にFixedValue(0.2,0.2,0.2,1)を足し合わせ、Albedoに適応したら完成です。