複数シーンのIBLを合わせる方法

ライティング

弊社のVR案件は、企業向けの安全体感や作業訓練が非常に多いのですが、

複数人の共同作業によるコンフリクトを避けるために、

「静的な背景」シーンと「動的なインタラクション」シーンを

完全に分離して制作しています。

 

背景担当がインタラクションシーンに触れることは一切なく、

またインタラクション担当が背景シーンに触れることは一切ありません。

インタラクション側が背景シーンを受け取り、

プレイ時にシーンの追加読み込みをするという形です。

 

背景シーンはがっつりライトマップを焼きますが、

インタラクションシーンはIBLのみです。

(屋外の場合は、太陽であるリアルタイムディレクショナルライトをプラス)

 

その際にちょっと工夫をしないと、

がっつりライトマップの背景とIBLの小物の馴染みが悪くなってしまうので、

お互いのライティングを合わせる方法を紹介したいと思います。

 

 ライトプローブで即解決?

そのとおりです。背景シーンにライトプローブを設定していれば概ね問題ありません。

しかし色むらが発生しやすく、特に大小様々な部品が密集するプロダクト系では

部品ごとに明るさが違うなど、クオリティコントロールが難しいため、

弊社では敢えてライトプローブを使用していません。その前提での手法です。

 

 背景側の設定

 背景シーン用のライティング

仮にこんなステージを用意しました。

三方が壁で一方が大きな開口です。

Unity ライティング IBL

 

とりあえず普通にライトマップを焼きます。

太陽ディレクショナルライトを1つ置き、Lighingタブは以下の設定です。

(重要項目ではありません。普通に焼いただけです。)

Unity ライティング IBL

 

反射を得るためにリフレクションプローブを配置します。

今回の作例は非常に単純な部屋の作りなので中央にひとつ配置するのみです。(Box Projection)

複雑なシーンの場合は必要に合わせて細かく配置するのも良いでしょう。

Unity ライティング IBL

 

リフレクションプローブはリアルタイム生成ではなく必ずベイクしてください。

ボケ反射に品質の差が出ます。

 

 インタラクションシーン用のライティング

背景シーンの中に、インタラクションシーン用のライティング設定を仕込みます。

 

VR体験者が主に立ち回る位置にリフレクションプローブを配置し、ベイクします。

例として、中央よりやや壁に近い位置を主な体験場所と仮定して設定します。
Unity ライティング IBL

 

ここで必要なのはベイクで生成されたリフレクションプローブのCubemapです。

シーンと同名のフォルダ内に、生成されたEXRファイルがあります。

(ReflectionProbe-0 的なファイル名)

これをインタラクションシーンで使用します。

 

インタラクションシーン用のCubemapを得るために

敢えて配置・ベイクしたリフレクションプローブなので、

背景シーンに影響を与えられては困ります。

そのため、ベイクが完了したら非表示もしくは削除します。

 

 

 インタラクション側の設定

先ほど主な体験場所と設定したあたりに小物を置いてみます。

ライティング検証結果をわかりやすくするために、

鏡面反射が強いの質感のものと、拡散反射が強い質感のものを用意しました。

Unity ライティング IBL

 

シーン内にライトは一切配置しません。LightingタブのIBLの設定だけ施します。

Unity ライティング IBL

 

この状態で「Generate Lighting」します。

すると、ライティングが生成されてIBLが施されます。

Unity ライティング IBL

 

 背景シーンをロードしてプレイ開始

インタラクションシーン内に、

背景シーンを追加ロードするコンポーネントを適当に作ってプレイ開始。

Unity ライティング IBL

 

壁を向いている面は暗く、開口部を向いている面は明るい。

そんなライティングがしっかり適用されています。

メタリックなものは背景側に配置したリフレクションプローブによって反射も適当です。

 

 追加検証

 インタラクションシーンでIBLを生成しないとどうなるか?

「Generate Lighting」しないでプレイ開始すると以下のようになります。

Unity ライティング IBL

 

メタリックなものは見た目のほとんどが鏡面反射成分なので、

これだけ見ると不自然ではありません。(背景シーンに配置したリフレクションプローブのおかげ)

しかし、拡散反射成分の強いものはほとんど真っ黒です。

 

Unityには、「最初に読み込まれたシーンのIBLが優先される」という特徴があるようで、

がっつりベイクの背景シーンを追加読み込みした際に、

そちらのIBL設定が自動的に適用される・・・なんて便利なことにはならないのです。

 

 背景シーンからインタラクションシーンをロードしたらどうなるか?(IBL生成前)

では逆に背景シーンをベースとして、

インタラクションシーンを追加読み込みしたらどうなるのかを検証します。

Unity ライティング IBL

 

先程も述べたように Unityは 「最初に読み込まれたシーンのIBLが優先される」ので、

全方位からの白昼のスカイライトでがっつり照らされてしまいました。

 

 背景シーンからインタラクションシーンをロードしたらどうなるか?(IBL生成後)

おまけに、先程と同じく背景シーンをベースとして、

IBL生成後のインタラクションシーンを追加読み込みしたらどうなるのかを検証します。

Unity ライティング IBL

 

同じです。全方位からの白昼のスカイライトでがっつり照らされます。

 

 まとめ

以上のことから、IBLを施した動的シーンから静的シーンを呼ぶのが最適です。

 

ロード時間の関係で、どうしても重い背景シーンを先に読んでおきた場合は、

IBL設定を施した空のシーンから、背景シーン・インタラクションシーンを呼べば良いでしょう。

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)