LoginSignup
11
6

More than 5 years have passed since last update.

Unity の Shader で環境光を得る

Last updated at Posted at 2017-12-24

はじめに

 Unity で MeshRenderer 用の Shader を記述する際、シーンの環境光情報を取得することは必須である。しかし Unity の Shader ファイルやマクロは多大である割に Document は皆無で発見しづらくバージョンアップで頻繁に変わるので、インターネット上の情報を参考にするとおかしくなることが多い。
 特にシーンの Lighting 設定で Environment Lighting を単色や Skybox で切り替えたりするとそれに追従できないユーザシェーダも多い。本記事ではシーンの Lighting 情報に対応する。

環境

 以下の 2 つで確認

  • Unity 5.6
  • Unity 2017.3

やり方

 UnityCG.cginc に宣言されている ShadeSH9 関数を使うだけである。

half4 indirectLighting = ShadeSH9(half4(i.normal, 1));

 i.normal は World 座標での法線である。
 また ShadeSH9 は Forward Rendering の場合、Pass の Tag が "LightMode" = "ForwardBase" のときのみ作用する。追加のライト Pass では黒色になる。

補足

 公式 Document の Shader Variables の項 を読むとたしかに書いてある。しかしこの書き方では Fog and Ambient の方を見てしまうと思うし、一般に普及している ShaderForge などのノードエディタで素直に書くと、Skybox 設定にしても Ambient Color の単色が作用してしまうなどの状況を見ると、定義が複雑すぎるのではないかと思う…
 Unity が PBR に切り替えた段階で旧来の Variable などはすべて Obsolute になればよかったのだが、そうもいかず今の時代も残って語弊を生んでいるのである…

11
6
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6