第16回 法線と基本的なランバート照明
この回では、メッシュが持つ法線をHLSLで受け取り、面の向きに応じた明暗を計算します。前期にShader Graphで扱ったランバート照明を、今回は頂点属性の受け渡しから順を追って組み立てていきましょう。
配布プロジェクト
Unity 6.6とURPを使用します。この回に対応する配布プロジェクトは準備中です。配布状況は配布ファイルに掲載します。
開始コードと基準値
第15回の参考実装をLambertStudy.shaderへコピーし、先頭のShader名をCourse/LambertStudyへ変更します。新しいMaterialからこのShaderを選び、法線とUVを持つSphereへ割り当てます。Textureは同じ練習画像、Tintは白、Tiling=(1,1)、Offset=(0,0)です。
この時点でTextureが表示されることを確認します。前回の作品がない場合も、参考実装からこの状態を作れます。実行環境とDepth Primingの条件は配布ファイルで確認してください。ステップ1では法線を色へ変換し、Texture表示をいったん置き換えます。
この回のゴール
この回では、同じ光の方向を指定したHLSLとShader Graphを比較します。光の方向はマテリアルのパラメータとして与えます。Scene内のライト設定とシェーダーの明暗計算を切り離して考えることで、どの数式によって画面の見た目が変わったのかを明確に確認できます。
- 法線をWorld空間へ渡し、補間後に正規化できます。
- 法線と光方向の内積から明暗を計算し、色と合成できます。
- 同じ入力のShader GraphとHLSLを比較し、中間表示で原因を調べられます。
今回のポイント
法線は面の向きを表します
頂点位置は、頂点がどこにあるか(位置)を表します。これに対して法線は、面がどちらを向いているか(向き)を表します。そのため、オブジェクトを平行移動しても、法線に移動量を加算する必要はありません。
同じ入力で明暗を比較します
比較用の二つのマテリアルには、同じテクスチャ、Tint、光の方向を指定します。どちらの実装もUnlitシェーダーを土台として明暗を自前で計算するため、Litシェーダーによる別の照明計算が重なることを避けられます。
前期のベクトルとライティングでは、内積による明暗の計算を扱いました。この回では、その計算式へ法線情報が届くまでの処理と、HLSLでの記述を確認します。第15回の参考実装を出発点として進めましょう。