執筆バージョン: Unreal Engine 4.26
|
今回はReflection Captureについてご紹介しようと思います。
※本記事では説明の都合上、PostProcessのScreen Space ReflectionsのIntensityを0に設定しています。
●Reflection Captureとは?
Reflection Captureとは、周囲の環境をキャプチャした静止画、もしくは指定したCube mapをオブジェクトの反射部分に投影してくれる機能を持つアクターです。
New Level > Defaultを選択したときに最初からレベルに配置されているこれですね。

通常これのおかげでUnreal Engineではきれいな反射が描かれています。
上記の画像のオブジェクトはMetallicが1、Roughnessが0のツヤツヤの金属ですが、ここからReflection Capture、つまり反射成分を取ってしまうと真っ黒な物体にライトによるハイライトがあるだけの見た目になってしまいます。(右図)

●Reflection Captureの特徴
ちなみに、Unreal Engineには以下の様な反射を描く方法があります。
https://docs.unrealengine.com/5.0/ja/reflections-environment-in-unreal-engine/

Reflection Captureはこの反射キャプチャ、というシステムです。これによる反射は静的であることがポイントです。
静的である(=リアルタイムではない)ことによって軽量であることがメリットです。
Reflection Captureはリアルタイムで物体同士の反射をONにしているわけではなく、周りの環境を一旦キャプチャして、それを反射する物体の反射部分に投影しているのです。
つまり動的に反射を返すことはできません!!!!


クリックして再生
↑メタリックグレイマン自身はReflection Captureによる静的な反射投影を拾えますが、Reflection Captureは動的オブジェクトのグレイマンを反射成分に含めることが出来ないため、壁面にグレイマンは反射していません。
またReflection CaptureはあくまでもReflection Captureのアクター位置からキャプチャした画像を投影しているので、アクターの位置によってはおかしな反射に見えたり、球状に投影するので湾曲したように見えてしまう場合があります。

※画像は説明用にReflection Capture Resolutionを上げています。
白い立方体が反射ではかなり大きいサイズに見えてしまっていたり(Reflection Captureと立方体の位置が近すぎるためです)、奥の壁の直線が湾曲しているのが確認出来ます。
つまり反射をそれっぽく見せているだけなので、正しく反射しているわけではありませんので注意が必要ですが、
軽量ですべてのプラットフォームで使用できるため一番使われている反射方法かと思われます。
ちなみに別の反射システム、平面反射(Planar Reflection)ですとこんな感じです。
(※Project SettingsでオプションをONにしないといけません。あと重いです。詳しくはこちらhttps://docs.unrealengine.com/5.0/ja/planar-reflections-in-unreal-engine/)


クリックして再生
動的オブジェクトのグレイマンのほか、Reflection Captureよりも周囲の環境を正確に反映しています。
●Reflection Captureの設定方法
ではReflection Captureの設定項目について見ていきたいと思います。
・映り込む環境について
・特に設定しない場合のReflection Capture
特に何も設定せずにDefaultレベルを作成したときは、Reflection Captureは周囲の環境をキャプチャして投影してくれています。
地面においてあるメッシュ以外に青空が写っていますが、これはSky SphereをReflection Captureがキャプチャしてそれを反映しているためです。

映り込む周りの環境を変えるには、実際にレベルに作られている環境を変える(この場合であればSky Sphereや床のマテリアルを調整して見た目を変えたり、周りにメッシュを置いたりなど)も方法の1つですが、他の方法も見ていこうと思います。
・Sky LightにCube mapを指定して映り込む環境を変更する
周囲の環境を変更する手段の一つとしてSky LightにCube mapを指定することができます。
Cube mapは大体の場合、HDRIをインポートして作成されています。
Sky Lightを選択し、Source TypeをSLS Captured SceneからSLS Specified Cubemapに変更します。
これにより、Cube mapを選択できるようになります。今回は違いがわかりやすいようにオレンジ色のDefaultCubemapを選択します。
(プルダウンにアセットが出てこない方はView OptionsからShow Engine Contentを有効にしてください)

そしてSky LightのMobilityをStationary、もしくはMovableにしてください。
(Staticですとライト自身をSpecularに影響させることができないため、HDR画像がReflection Captureでキャプチャできません。)

そしてBuild Reflection Capturesを押してReflection Captureを更新しましょう。

するとSky Lightに指定したCube mapが周囲の環境として反射部分にあらわれているのが確認できます。

・Reflection CaptureにCube mapを指定する
Reflection CaptureにもSky Lightと同じく、Cube mapを指定できる部分があります。
Reflection Source TypeからCaptured SceneからSpecified Cubemapに変更し、Cube mapを設定します。
先程Sky Lightに設定したものとは別のCube map、Desert_Outer_HDRを設定してみます。

すると以下の画像のように、反射される内容が設定したCube mapになっています。
これはReflection Captureで設定したCube mapで、Sky Lightで設定したCube mapの環境を上書きしている状態になります。

・Influence Radiusの設定
試しにInfluence Radiusを500にして、Reflection Captureの位置を図のように動かしてみましょう。


するとReflection CaptureはInfluence Radiusの範囲内はReflection Captureで設定したCube mapを、
それ以外は全体の環境として設定されているSky LightのCube mapをブレンドして反射に投影してくれます。
レベルに配置してるオブジェクトによる環境や、Sky Lightで設定したCube map以外の映り込みを置きたい場合はこのように設定していくと良いかもしれません。
(HDR画像という容量大きめのテクスチャ参照が増えることに注意してください)
もちろん一番最初の状態、Sky LightがStaticで、Sky LightにもReflection CaptureにもCube mapが設定されていない状態ですと、
Influence Radiusからメッシュがはみ出ていると反射部分でも何も投影されなくなってしまいますのでご注意ください。

Influence RadiusはそのReflection Captureアクターからの反射の投影を影響させたいオブジェクトが含まれるように設定しましょう。
境界端はフェードしますので、少し余裕を持ったサイズに設定しましょう。
・Reflection Captureの配置場所について
繰り返しになってしまいますが、Reflection Captureは自身の位置からのキャプチャーをInfluence Radius内に反映するため、
配置する場所で見た目が異なってきます。
例えば今まで使用してきたこのレベルで、正面から見たときの見た目はそれほどおかしくありませんが、
後ろから見ると正面にあったはずのSphereやCone、さらにはSphere自身が映り込んでいるといった、
不思議な見た目になってしまっています。

このような場合は一番大きなSphereの内部にReflection Captureを配置して見ると良さげなキャプチャになります。


このように欲しい反射が得られるようにReflection Captureの配置場所には気をつけましょう。
以下公式ヘルプページの下部に、Reflection Captureを配置する際の目安が図で示されています。
ヘルプページでも言われていますが、Reflection Captureは軽量といっても置けば置くほど負荷は増えていきますのでほどほどにしておきましょう。
https://docs.unrealengine.com/4.27/ja/Resources/Showcases/Reflections/
またエディタのビューポートのView ModeをReflectionsにすると、シーンの反射状況を確認しやすくなります。
配置の際の確認などに使用出来ます。



・反射の反射
もしかしたら今までの画像を見ていて気づいた方もいるかもしれませんが、
金属同士の反射の内容が少しおかしく描かれています。

よく見てみるとキャプチャされているConeやSphereには反射が描かれていません。
これはReflection Captureが
周囲の環境をキャプチャ→反射部分に投影を1回だけしか行わないためです。
もし上記画像のような反射の中の反射を正しく描こうとする場合、
周囲の環境をキャプチャ→反射部分に投影→周囲の環境をキャプチャ→反射部分に投影
と、最低でも2回はキャプチャを行わないといけないためです。
残念ながら、Reflection Captureはこのような反射の反射までは対応出来ません…
できるだけ合わせ鏡のようになってしまう背景にしないようにしたり、反射がはっきり見えないよう形状を複雑にしたり、
他の反射方法を使用したり、他のフェイクの表現を加えたり、そもそもこんなにピカピカに反射しないようにする…
などしてうまく回避しましょう。
・Visible in Reflection Captures
映り込んでほしくないオブジェクトをそもそもReflection Captureにキャプチャされないように設定することが出来ます。
これはReflection Captureではなく、メッシュアクターに側にあります。
試しにConeと小さい手前にあるSphereに設定してみましょう。
2つを選択して、Renderingの項目からVisible in Reflection Capturesのチェックボックスを外した状態にしてみましょう。

そしてBuild Reflection Capturesします。すると先程までは反射の中にあったConeとSphereが無くなっていることが確認出来ます。
※ただしメッシュそのものは消えても、メッシュから落ちる影などはキャプチャされてしまいますので確認しながら使用しましょう。

今回は長くなってしまいましたが以上となります。
ライトやポストプロセスと異なってあまり取り上げられていないように見えるReflection Captureですが、
上記に説明した以外にもいくつかReflection Capture周りの設定はありますので、
気になった方はぜひ公式ヘルプページなどを御覧ください。ありがとうございました!