今回はUnityでのライティング(=照明)に関する話題で、タイトルの通り
を一通りまとめてみるという内容になっています。
Unityで3Dゲームを作っていると、シーンのライティングをベイクする(=つまり、ライトマップを作る)機会が多いのですが
- ライティングをベイクしたらシーンが汚くなってしまった!
- 影の付き方やオブジェクトの明るさがおかしい(=黒っぽくなるなど)
- ライティングのベイクに時間がかかっていつまでも終わらない
といった問題に遭遇する場面が結構あります。しかも原因がよく分からないことが多いので初心者の方からしたらお手上げ状態になってしまうのではないでしょうか。
そこでここでは、ライトマップのベイク作業で発生しがちな問題の対処法をご紹介しますね。
そもそも「ライティングをベイクする」とは?ライトマップって何?
でははじめに、そもそも
- ライティングをベイクするってどういうこと?
- ライトマップとは?
と思っている初心者の方もいらっしゃると思いますのでその点から説明しようと思います。
ライトマップ=シーンの明るさや影をテクスチャ化したもの
まずライトマップとは、簡単に言えばシーンの明るさや影などのライティング情報をテクスチャ化したものです。絶対に動かないゲームオブジェクトの場合であれば、ライトマップを3Dモデルの表面に貼り付けることであたかも照明が適用されているかのような見た目になります。
このライトマップを作る理由は一言でいえば計算処理を省略するためです。もちろんリアルタイムでライティング情報を計算してもよいのですが、ライティングの計算は重いので事前計算できるのであればそれを活用するに越したことはありません。
このような次第で、主にシーン上の動かないゲームオブジェクトに対してライトマップを作るのが一般的となっています。
ライティングのベイク=ライトマップを作ること
次に「ライティングをベイクする」とは、ライトマップを作ることを指します。照明情報をテクスチャに焼き付けるような印象の処理になるので「ベイク」と呼びます。覚えておきましょう。
ライティングのベイクが上手くいかない場合の対処法まとめ
さて基本的な部分についてご理解頂いたところで本題に入ります。ライティングのベイクが上手くいかない場合としては
- ベイク結果が思い通りにならない場合(汚くなる・色が変になる等)
- ベイク処理に時間がかかって終わらない場合
といった2パターンが考えられるので、それぞれについて対処法をご紹介していきますね。
ベイク結果が思い通りにならない場合(汚くなる・色が変になる等)
まずはベイク結果が思い通りにならない場合です。主に次のような問題にぶち当たることがあります。
- ベイクしたら変な模様が出る場合
- ライトマップが汚くなる場合
- ベイクしたら色が黒っぽくなる場合
それぞれ対処法を見ていきましょう。
ベイクしたら変な模様が出る場合
まず、ライティングをベイクしたら3Dモデルの表面に変な模様が出てしまうことがあります。このような場合は3Dモデルのインポート設定で「ライトマップUVを生成」にチェックを入れて再度ベイクすると改善することがありますのでお試しください。
ライトマップが汚くなる場合
次にライトマップが汚くなってしまう問題に遭遇することもあります。この場合は様々な原因が考えられますが、例えばライトマップの生成結果がジャギジャギしていて滑らかではない場合はライトマップの圧縮を「なし」にすると改善する場合があります。
ただし圧縮をOFFにするとライトマップのファイルサイズがかなり大きくなってしまう可能性があるので注意が必要です。
ベイクしたら色が黒っぽくなる場合
LOD(=Level of Detail)を使っているゲームオブジェクトの場合など、そのままライティングをベイクすると色が黒っぽくなってしまう場合があります。
このような場合は
- ライトプローブを使う
- それでもダメならリアルタイムでライティング計算を行う
といった対処法があります。
ベイク処理に時間がかかって終わらない場合
さてお次はライティングのベイク処理に時間がかかっていつまでも終わらない場合の対処法です。主な原因としては次のようなものが挙げられます。
- ベイク対象の面積が広すぎる
- ベイク対象が落とす影の面積が広すぎる
- GPUライトマッパーを使っていない
- ライトマップ解像度が高すぎる
- サンプル数が多すぎる
- ライトマップサイズが大きすぎる
- ライトを置きすぎている
ではそれぞれ対処法を見ていきましょう。
ベイク対象の面積が広すぎる
まず当たり前の話ですが、ベイク対象のゲームオブジェクトの面積(※スケールとかではなく実寸)が広いとベイク処理に時間がかかります。なのでなるべくベイク対象の面積は小さい方が時間がかからずに済みます。
ただしTerrainなど広大になりがちなゲームオブジェクトもあり、レベルデザインの関係でなかなか小さくできない場合もありますのでその場合は別の対処法を先に試すようにしてください。
ベイク対象が落とす影の面積が広すぎる
次はベイク対象が落とす影の面積が広くてもベイク処理に時間がかかります。
したがって何でもかんでも影が落ちるように設定すると、大量のゲームオブジェクトがある場合にベイクに時間がかかるようになるかもしれません。もし気になるようであれば、メッシュレンダラーコンポーネントの「投影」をオフにするのがよいと思います。
GPUライトマッパーを使っていない
次にライティングのベイク処理には
- CPU
- GPU
のいずれかを使うのですが、CPUよりもGPUを使う方がずっと高速にベイクすることが可能です。お使いのPCに高性能なグラフィックボードが積んである場合は、ライティング設定ウィンドウで「プログレッシブGPU」を選択しましょう。
※ライティング設定ウィンドウはメニューバーの「ウィンドウ」→「レンダリング」→「ライティング」から開くことができます。
ライトマップ解像度が高すぎる
さてライトマップ解像度が高すぎる場合もベイク処理に時間がかかります。そこで時間がかかりすぎる場合はライティング設定ウィンドウからライトマップ解像度の値を下げてみるとよいでしょう。
ただしライトマップ解像度を下げると影がぼやけた感じになるので、その辺は上手いこと値を調整してください。
サンプル数が多すぎる
直接サンプル・間接サンプル・環境サンプルのそれぞれの値が大きい場合もベイクに時間がかかります。値を下げることでライトマップの品質は下がりますが、ベイク処理がより速くなる可能性があります。
ライトマップサイズが大きすぎる
ライトマップの最大サイズが大きすぎる場合もベイク処理に時間がかかります。必要に応じて小さくしてみましょう。
ライトを置きすぎている
最後はシーンにライトを置きすぎている場合もライティングに時間がかかります。特に
- ポイントライト
- エリアライト
など広範囲を照らすライトを使うとベイク時間が長くなる傾向があるため、大量のライトを配置しないように工夫してみてください。
おわりに
以上、ライトマップのベイクが上手くいかない場合の対処法を一通りご紹介しました。
Unityのライティングは設定項目が多く、結果も変になる場合があってなかなか大変ですよね。しかし上記の内容を参考にしていただけばライトマップを素早く綺麗にベイクできるようになると思いますのでぜひ試してみてください。
この記事がUnityでのゲーム開発のお役に立てば幸いです。