はじめに
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 になればよかったのだが、そうもいかず今の時代も残って語弊を生んでいるのである…