新しいこと、枯れたこと問わずサムザップ大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。ShaderUnityでシェーダを書く場合、とりあえず開発者が必要そうな変数やら関数はUnity側で用意されていることが多いので"UnityCG.cginc"、"AutoLight.cginc"、"Lighting.cginc"この辺りのファイルたちを眺めると良い感じです。このようなライト方向とカラーを適用したいわゆるランバートシェーダを書いてみます。※前提としてディレクショナルライト1個の世界ライトベクトルは_WorldSpaceLightPos0と記述すればUnityが勝手に値を突っ込んでくれます(とっても便利)。_lightColor0と定義すれば、先取同様Unityが勝手に値を突っ込んでくれます。Lighting.cgincをインクルードしているとコンフリクトしてコンパイルエラーになるので注意です。_WorldSpaceLightPos0は頂点シェーダで使うことが出来ず、フラグメントシェーダ内でしか使えません。エラーは出ませんが、おそらく値が(0,0,0,0)になっています。上のサンプルはピクセルライティング(ピクセル単位でライト処理を実行している)なのですが、頂点ライティングもやってみます。いうことで頂点ライティングは以下のような実装になります。C#側からシェーダへライトベクトルを渡す頂点シェーダで頂点単位で拡散反射輝度を計算するフラグメントシェーダで頂点ごとの輝度を描画するシェーダとC#のサンプルコードです。これらを描画するメッシュ、GameObjectにアタッチする想定です。簡単な方法を後述していますと、ここまで書いててあれですが、WorldSpaceLightDirというヘルパー関数があります。この関数を使えば頂点シェーダ内で、ライトベクトルが取得できることがわかりました。※C#のコードは不要となりますorz最終このシェーダだけで頂点ライティングが出来るようになりました。まとめ頂点シェーダ内でディレクショナルライトベクトルを受け取る方法は、WorldSpaceLightDir(オブジェクト空間頂点座標)というヘルパー関数を使用するです。頂点シェーダ内でライト方向を取得する方法Tweet読者になるボタンを押して貰えるととてもがんばれます。大庭俊介(bao_bao)渋谷のUnityエンジニア。スマホゲーム作って生活しています。設計、組み込み、演出一通りを自分1人で完結して作るのが得意です。よろしければTwitterフォローお願いします。(@ohbashunsuke)株式会社サムザップでUnityエンジニアとしてスマホゲーム作っています。(1)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。