執筆バージョン: Unreal Engine 4.23 |
こんにちは。テクニカルアーティストの黒澤です。
今回はライトプローブを使用した間接照明についてみてみたいと思います。
ライトプローブとは
UE4ではリアルタイムにGlobalIlluminationを計算できないので、事前計算でライトマップにベイクします。
基本的には建物なとの静的メッシュはライトマップテクスチャにベイクしますが、キャラクターやドアなどの動的メッシュはライトプローブのデータを受け取って、空間中の適切な照度で間接ライティングされます。
UE4.18から動的メッシュに対するライトマップが、間接ライティング キャッシュからボリュメトリックライトマップに変わったため、ピクセルごとに補間する、より馴染みやすいライティングになりました。
https://docs.unrealengine.com/ja/Engine/Rendering/LightingAndShadows/VolumetricLightmaps/index.html
基本的にはUE4ではライトプローブは動的メッシュに対して使われるように設計されていますが、今回、実験的にすべてのメッシュをライトプローブで計算するという試みを行いました。
サンプルプロジェクトの設定を編集する
ライティングのサンプルとして、懐かしのRealisticRenderingを使います。
シーンを開いた状態ではこのような絵になります。

内観の陰影の状況をもっとよく見たいのでカメラアングルを変更します。以下、基本的にこのアングルで見比べることにします。

まずは正しくライティングを見るために、ポストエフェクトの効果を消します。
UE4はPostProcessVolumeがなくともデフォルトで設定が入ってしまうので注意しましょう。
PostProcessVolume(VRsetup)はこのシーンには関係ないので削除します。
PostProcessVolume3の設定を以下のように変更します。
- AmbientOcclutionのIntencityを0に変更
- LensFlareのIntencityを0に変更
- BloomのIntencityを0に変更
また、CineCameraのVinetteIntencityも同じく0にします。
ポストプロセスを外した結果、以下の絵になりました。

今回は間接照明の効果を比較したいので、室内のスポットライトやSkyLightの代わりに置かれているスポットライトを削除して、直接光成分を減らします。こちらのライトをなくし、代わりにスカイライトを置きます。

LightQualityをProductionにしてライトビルドします。
直接光成分がなくなったためにだいぶアーティファクト(ライティングのもやもや)が出てきました。

ゲームの種類やハードにもよるのですが、こちらのLightMapの設定は結構贅沢です。
LightMapDencityを確認するとこのような見た目になります。

ゲーム開発でのライトマップのサイズ制限についてはこちらのドキュメントが詳しいです。
https://www.slideshare.net/EpicGamesJapan/cs-66750222
ライトマップのテクセルがおおよそ1M/5pixelになるまで小さくします。この状態でライトビルドを行います。

このような条件下では、ライトマップはなかなかアーティファクトが多く、調整が大変ということがおわかりいただけるかと思います。

ライトプローブ用に編集する
比較するシーンができましたので、今度はライトプローブ用のシーンを作ります。
スタティックメッシュをすべて選択してForceVolumetricにします。
これだけでライトマップテクスチャではなくライトプローブを参照するようになります。この設定は動的メッシュにした状態とは異なり、ライトプローブにも影響を与え、拡散反射を行います。

Lightmassの設定を以下のようにします。
ここでのコツはVolumetric Lightmap Detail Cell Sizeの値です。

レンダリングした結果、以下のような絵になりました。
先程の絵に比べるとモヤモヤは少なく、だいぶスッキリして見えると思います。

ライトマップとライトプローブの比較
それぞれの絵をライティングのみの状態で確認してみます。
デフォルト設定

ライトマップ解像度低+補助ライトなし

ライトプローブ+補助ライトなし

ビルド時間やデータサイズを確認してみます。
|
ビルド時間 |
BuiltDataサイズ |
デフォルト設定 |
1:52 |
18.24MB |
ライトマップ解像度低 |
0:18 |
6.14MB |
ライトプローブ |
0:16 |
4.37MB |
ライトビルドの時間に大きく影響するのはライトマップのテクスチャサイズなので、ライトプローブを使用した場合はレンダリング時間とデータサイズはとても早く、小さくなります。
ライトマップテクスチャの設定の大変さ
苦手な間接照明を比較するために厳しい設定にしましたが、今回の背景はまだ良い方です。背景はなるべくモジュラーですすめるのが、レベルデザインの自由度からも望ましいですが、パーツが分かれるほどシャドウリークが発生しやすくなります。
そのうえライトマップテクスチャは、別のテクスチャ同士の補間を行わないため、配置したメッシュごとに明るさがまちまちになります。
逆説的に、ライティングのコツ
ライティングに厳しいシーンに作り変えて改めて気がついたのですが、ライティングのコツとしてなるべく直接光を当てることでシャドウリークはかなり緩和します。
また、リークが出たとしてもテクスチャが強いと気になりにくいので、なるべく情報量のデザインにしたいところです。
欠点は多い
UE4でライトプローブのみで間接ライティングを行うには欠点が多いです。
一番の大きな要因はコントロールできるパラメーターが少ないことです。配置密度はVolumetric Lightmap Detail Cell Sizeにほぼ一任され、グリッド状に配置されます。
UE4はライトプローブの配置のコントロールができないので、グリッドの配置の運の悪さがそのままリークに繋がります。今回の絵でいうと窓際の壁を無視しして突き抜けたような明るさになっています。
ライトプローブのみの間接ライティングは使い所が難しいですが、はまる案件はあるかもしれないので、選択肢の一つにしていただき、参考になれば幸いです。