[Unity]レンダリングパス(Forward/Deferred)の違いで時間を食われた話
今作成しているゲームで試しにと焼いたライトマップが何故か意味不明な焼け方をして、これを解決するのに4日程かかってしまったのですが、とある設定を変更した所すんなり解決したので、備忘録として残しておきます。
まあタイトルでネタバレしてるんですがね……
Unityのバージョンは2019.4.17f1です。
何が起こったか?
今作っているマップが地下鉄のステージなんですが、当然地下なので普通の太陽光、つまりDirectionalLightではなくPointLightを多数配置したライトの構成になっています。
今回使用したアセットはこちらの地下鉄に必要な物が一通り含まれたものになります。
で、練習というか検証で試しにLightingウィンドウからライトをベイクしてみたら、予想とは反するライトマップが出来上がってしまい困惑しました。
これが地獄の始まりだった……
その様子がこちらになります。
分かりますでしょうか? このマップでは複数のモジュール化されたプレハブを組み合わせて作成していますが、一部分のプレハブのライトマップが正常に生成されていません。
この場合ですと、トンネルに当たるプレハブと壁のプレハブで、光の加減が合ってませんね。
まあ設定を何も詰めていないからこうなんだろうと最初は思っていましたが、この後いくらLightingの設定を変えてみても上手くいきませんでした……
根本的な原因はプロジェクト設定だった
そこから4日間ぐらい色々と調べたりした結果、ようやくたどり着いた答えが「プロジェクト設定を変えないと駄目」でした。
具体的には、プロジェクト設定の中にあるグラフィックの項目ですね、ここにあるRenderingPathのプルダウンをForwardからDeferredに変更します。
Use Defaultのチェックが最初は入っているので、外してから全ての設定欄(Tier1からTier3まで)にこの設定を適用します。
この状態で再度、先程のステージを焼いてみると……
一目瞭然ですね、綺麗にライトの光が反映されています。
この設定ですが、何故判明したかと言うと今回使用したアセットの中にあるドキュメントに「この設定を入れないとライトがおかしくなるよ!」と英語で書かれていたからなんですね。
説明書は読みましょう、反省しております。
そもそもレンダリングパスって何?
問題は解決してめでたしめでたしと締めくくりたい所ですが、何の設定を変更したかもよく分からない状態で終わるのは気持ちが悪いので、調べてみました。
2018.4のUnity公式ドキュメントに答えが載っていました。
Unity は異なる レンダリングパス に対応しています。どれを選択すべきかは、ゲームの内容やターゲット、ハードウェアに依存します。異なるレンダリングパスは、ライトやシャドウに影響を与える異なる特徴やパフォーマンスを持ちます。
https://docs.unity3d.com/ja/2018.4/Manual/RenderingPaths.html
そのままですが、レンダリングパスはどうやらライトやそれによって生成される影に影響を及ぼすみたいです。
今回変更したDeferredは、ライトと影を最も厳密に計算してくれる方法でリアルタイムに多数のライトを計算したい場合に最適らしいですが、ハードウェアの要件レベルも上がる。
逆に初期設定であるForwardは従来の方法で、複数のライトを設置した場合最も明るい少数のライトのみピクセルライティングモードで、残りはオブジェクトの頂点やオブジェクトごとに計算してくれるみたいです。
細かい用語はいまいち把握しきれていませんが、今回の様な複数のライトを設置してライトマップを生成する場合は、とりあえずDeferredにしておけば問題なさそうですね。
Deferredのメリット・デメリット
○複数のライトの影響を全て計算し正確に反映する
○ライトの数がパフォーマンスに影響しない
✕アンチエイリアスを使えない
✕半透明なオブジェクトには適用されない
✕Mesh RendererのReceive Shadowsが固定で有効になる
✕GPUがMRT及びShader Model 3.0(モバイルの場合OpenGL ES 3.0)以降に対応している必要がある
いくつか上げましたが、こうして見ると色々と制限があることが分かります。
ただしアンチエイリアスはカメラ側の効果で代用できますし、GPUの問題に関しても2006年以降に製造されたものであればほとんどは対応している様です。
問題は半透明なオブジェクトですが、こちらはFowardで計算されてしまうので、なるべく光源の多い場所では使わない方が無難です。
ちなみにライトの数がパフォーマンスに影響はしませんが、一つ一つのライトが照らす範囲が広いと負荷は上がるので注意です。
やはりデメリットよりもメリットの方が魅力的なので、今回はこちらを採用します。