こんにちわ、オオバです。

Unityでシェーダーを書く場合、とりあえず開発者が必要そうな変数やら関数はUnity側で用意されていることが多いので
"UnityCG.cginc""AutoLight.cginc""Lighting.cginc"この辺りのファイルたちを眺めると良い感じです。

Unity 頂点シェーダー内でライト方向を取得する方法_19
このようなライト方向とカラーを適用したいわゆるランバートシェーダーを書いてみます。
※前提としてディレクショナルライト1個の世界

Lambert_pixelLighting.shader · GitHub

ライトベクトルは_WorldSpaceLightPos0 と記述すればUnityが勝手に値を突っ込んでくれます(とっても便利)。
ライトのカラーはfixed4 _lightColor0と定義すれば、先取同様Unityが勝手に値を突っ込んでくれます。

ただし、Lighting.cgincをインクルードしているとコンフリクトしてコンパイルエラーになるので注意です。

それらのデータを使って処理を書いていくわけですが、こんなに至れり尽くせりなのですが、 _WorldSpaceLightPos0頂点シェーダーで使うことが出来ず、フラグメントシェーダー内でしか使えません。エラーは出ませんが、おそらく値が(0,0,0,0)になっています。

上のサンプルはピクセルライティング(ピクセル単位でライト処理を実行している)なのですが、頂点ライティングもやってみます。

ということで頂点ライティングは以下のような実装になります。

シェーダーとC#のサンプルコードです。
これらを描画するメッシュ、GameObjectにアタッチする想定です。

※注意 : もっと簡単な方法を後述しています

LambertVertexLighting.shader · GitHub

と、ここまで書いててあれですが、WorldSpaceLightDirというヘルパー関数があります。
この関数を使えば頂点シェーダー内で、ライトベクトルが取得できることがわかりました。
※C#のコードは不要となりますorz

WorldSpaceLightDir関数使ってる · GitHub

最終このシェーダーだけで頂点ライティングが出来るようになりました。

まとめ

です。

👉 オススメ記事

2021秋 Asset Refreshセール
100以上のアセットがなんと50%OFF!!オオバもいくつか買いました!
期間 : 10月2日午後3時59分まで

👩‍💻 検証環境

🙏 参考サイト