2014年12月2日火曜日

UE4のReflectionについて

UE4のReflection(反射)について調べてみたことをまとめてみました。

反射については公式ドキュメントに解説ページがあります。
【公式】反射環境
【公式】反射の事例


ふんふん、なるほど…ではあるのですが、
ちょっと理解ができなかった部分もあるのでテストしてみました。



テストで使用したレベルは以下の様なもの用意してみました。



このシーンにはReflection Captureは配置されていません。
しかし、自動的に反射が計算されています。

これは何で計算されているのかというと、
Screen Space Reflectionで計算された結果です。




Screen Space Reflection

Screen Space Reflectionとはリアルタイムで計算されている反射のことです。

Screen Space ということなので画面の範囲内の反射だけが計算されています。
画面の外に地球が出てしまうと後ろの映り込みが消えてしまうのがわかりますよね。




Screen Space Reflection は自動で入るようになっていますが、
Post Process Volumeで設定を変更することができます。


例えば、Intensityを動かすとこのようにScreen Space Reflectionを消す事ができます。




とはいっても、Screen Space Reflectionを消す必要はないと思いますし、
Qualityを上げることも処理負荷の点からみても良いものではないので
基本的にはいじる必要はない項目だと思います。



Reflection Capture (Sphere / Box)

では、このシーンにReflection Captureを配置してみます。
真っ暗だった金属壁に空の色が映りこみました。



これはキャプチャされたCubemapが反映されているので、
画面の範囲外のものも反射に表示されます。
これで先ほどのScreen Space Reflectionでは画面の外側のものは反映されないという
弱点を補う事ができます。

しかし、よく見るとReflection Captureの映り込みとScreen Space Reflectionの位置が
一致していないのがわかります。


で、この問題に対して、ドキュメントにはこのように記載があります。


このメソッドによる反射はおおよその結果です。具体的に、オブジェクトの反射はシンプルな形状への投影となるため、 実際のシーンのオブジェクトとほとんど上手く調和しません。たくさんのキューブマップが一緒にブレンドされているため、 多様なバージョンのオブジェクトを反射へ作成する傾向があります。鏡面反射の要因となる平面、滑らかなサーフェスは、 エラーをはっきりと表示します。反射を分散させるために、 詳細な法線マップとラフネスを使用します。

↑Unreal Documentより転載


つまり、つるつるで平面のものにはこのようにキューブマップの誤差が出てしまうので、
曲面の形状使用したり、ザラザラとした表面の質感にすることで、
キューブマップの誤差をごまかすといい反射の表現ができますよ。

ということですね。


反射をうまく取り入れるためには
そのシーンで使用しているマテリアルにも気を配らないといけませんね。




Reflection Captureのパフォーマンス

Reflection Captureはその半径が重なるように配置することが可能ですが、
パフォーマンスの観点からみてたくさん配置したらいいというものではないようです。

Reflection Captureはその半径サイズが小さいほうが優先して表示されます。
重なっている部分はCubemapの合成が計算されているわけです。

そう考えるとたくさん重なるように配置することは
パフォーマンスに負荷を与えてる事が容易に考えられます。



公式ドキュメントの反射の事例にも記載がありますが、
下図のように重なりを最小限にしつつ、
必要な箇所に詳細な反射が入るように配置するのが良さそうです。
↑公式より転載


つまり、金属のような詳細に反射するものがなければ
グリーンように小さい半径で配置するものも必要ないということですね。

作成するシーンで使用する質感を見ながら配置をおこなう必要があります。


まだまだ色々ありそうですが、
公式ドキュメントをひと通り読むと詳細な部分は把握できると思いますのでご一読あれ。

0 コメント:

コメントを投稿