Unreal Engine (UE) は、リアルタイムでの平面反射 (Planar Reflection) をサポートしています。スクリーンスペース反射 (SSR: Screen Space Reflection) よりも反射を正確に見せることができますが、レンダリング負荷は高くなります。これは、平面反射機能が、反射方向から再びレベルを正確にレンダリングするためです。
スクリーンスペース反射と平面反射の比較
レンダリングをするなら、スクリーンスペース反射の方が平面反射よりはるかに効率的ですが、信頼性は劣ります。以下の画像の比較は、スクリーンスペース反射と平面反射の限界を示しています。
スクリーンスペース反射: 左の画像はスクリーンスペース反射の限界を示しています。画像の端あるいはプールの一部で、反射が消え始めるカメラ ビューに向かってかなりの量の漏れが発生していることに注目してください。これは、SSR はオフスクリーンのオブジェクトを反射することができないためです。
平面反射: 右の画像は同じレベルですが、平面反射を有効にしました。プールのサイドと端でさえも画像に漏れがまったくなく、反射が一定かつ正確であることに注目してください。これは平面反射がオフスクリーンのオブジェクトを反射することができるからです。
平面反射を有効にする方法
プロジェクトでこの機能を使用するには、以下の手順を行います。
メイン メニュー パネルで [Edit] を開き、[Project Settings] を選択します。
[Project Settings (プロジェクト設定)] メニューから [Rendering] > [Reflections] セクションに進みます。
[Support global clip plane for Planar Reflections (平面反射のグローバル クリップ プレーンをサポート)] の横にあるチェックボックスをクリックします。
平面反射を有効にした後、UE エディタを再起動しないと、Planar Reflection は使えません。
プロンプトが表示されたら UE Editor を再起動します。
UE Editor を再起動したら、[Place Actors] パネルの [Visual Effects (ビジュアル エフェクト)] セクションで、[Planar Reflection Actor] を選択してレベルへドラッグします。
Planar Reflection アクタをレベルに配置したら、G キーを使ってこのアクタの表示 / 非表示を操作できます。Move、Rotate、Scale ツールでも、Planar Reflection アクタの配置やサイズをうまく調整して、レベルのニーズに合わせることができます。
近くの反射マテリアルは、Planar Reflection アクタがレベルに追加されるとすぐに自動的に反映されます。レベルに配置されたスタティック メッシュも、法線で反射を歪めることで波のシミュレーションが可能です。
Planar Reflection アクタのプロパティ
Planar Reflection アクタには、反射の様子を大胆に変更できる様々なプロパティがあります。以下の表はこれらのプロパティの説明、および Planar Reflection の様子がどのようになるかの説明です。
プロパティ |
説明 |
|
---|---|---|
Normal Distortion Strength |
平面の反射を歪めるときの法線の強さを制御します。 |
|
Prefilter Roughness |
Planar Reflections テクスチャをプリフィルタするラフネス値です。低解像度のテクスチャを非表示にする場合に便利です。この値が大きいほど GPU 負荷も大きくなります。 |
|
Distance from Plane Fadeout Start |
反射平面からこの距離でピクセルを受け取って、平面反射の平面反射のフェードアウトを開始します。 |
|
Distance from Plane Fadeout End |
反射平面からこの距離でピクセルを受け取って、平面反射の平面反射を完全にフェードアウトします。 |
|
Angle from Plane Fade Start |
反射平面からこの角度の法線のピクセルを受け取って、平面反射の平面反射のフェードアウトを開始します。 |
|
Angle from Plane Fade End |
反射平面からこの角度の法線のピクセルを受け取って、平面反射の平面反射を完全にフェードアウトします。 |
|
Show Preview Plane |
エディタで作業中に反射平面の表示を切り替えます。平面反射に影響は与えません。 |
|
詳細なプロパティ |
||
Prefilter Roughness Distance |
プリフィルタ ラフネス値が到達する距離です。 |
|
Screen Percentage |
ダウンサンプル パーセンテージを使用すると、平面反射のレンダリングにかかる GPU 時間を短縮できます。平面反射によって生み出させる反射の質に直接影響します。 |
|
Extra FOV |
反射テクスチャへのレンダリングに使用する追加の FOV です。法線ひずみにより、反射テクスチャ外の読み取りが発生している場合に便利です。値が大きくなると、平面反射にレンダリングが必要なオブジェクトと三角ポリゴンが増えるため、レンダリングのスレッドおよび GPU コストが増大します。 |
|
Render Scene Two-Sided |
シーンを両面としてレンダリングするかどうかを指定します。反射面によってクリップされたオブジェクトの「下」で通常の歪みが読み取られるアーティファクトを非表示にするのに役立ちます。この設定を有効にすると、明るい空である可能性のある背景ではなく、クリッピングされた領域にメッシュの背面が表示されます。これを有効にする場合は、水面が反射をブロックしないため、水面を Hidden Actors に追加してください。 |
|
LOD Distance Factor |
LOD で使用される距離をスケーリングします。シーン キャプチャでメイン ビューよりも低い LOD を使用することでシーン キャプチャ パスを高速化するには、1 より大きい値に設定します。 |
Planar Reflection アクタの Scene Capture プロパティ
Planar Reflections アクタでは、いくつかのプロパティを使って、キャプチャされるリアルタイム反射のパフォーマンス負荷を制御することができます。
プロパティ |
説明 |
|
---|---|---|
Primitive Render Mode |
シーン キャプチャにレンダリングされるプリミティブを制御します。
|
|
Capture Source |
キャプチャ ソース タイプを制御します。
|
|
Capture Every Frame |
キャプチャのコンテンツをフレームごとに更新するかどうかを指定します。無効にすると、コンポーネントは読み込み時に 1 回と移動する時に 1 回更新されます。 |
|
Capture on Movement |
移動の際にキャプチャのコンテンツを更新するかどうかを指定します。ブループリントから手動でキャプチャする場合は無効です。 |
|
Always Persist Rendering State |
Capture Every Frame が無効になっていてもレンダリング ステートを保持するかどうか指定します。モーション ブラーとテンポラル アンチエイリアシング (TAA) のベロシティの計算が可能になります。 |
|
Hidden Actors |
シーン キャプチャで非表示にするためにレベルで使用できる選択されたアクタのリスト。 |
|
Show Only Actors |
Use ShowOnly List の Primitive Render Mode を使用するときに、このシーン キャプチャによってレンダリングされるレベル内で使用できるアクタのリスト。 |
|
Max View Distance Override |
値が 0 より大きい場合、シーン キャプチャでレンダリングされたプリミティブに対して最大レンダリング距離 (センチメートル) を設定します。反射する平面が玄関や部屋のように閉ざされた領域である場合、反射からのカリング距離オブジェクトに使用することができます。 |
|
Capture Sort Priority |
複数のキャプチャ コンポーネント間の相互依存を解決するため、GPU でシーン キャプチャをソートするためのフレーム内のキャプチャ優先度です。最も値が高いものが優先されます。 |
|
Use Ray Tracing if Enabled |
このキャプチャのレイトレースを使用するかどうかを指定します。このプロジェクトでレイトレースを有効にする必要があります。 |
|
Profiling Event Name |
GPU のプロファイリング時にプロファイリング イベントの名前を設定します。レベルで複数の Planar Reflections を使用している場合に、どの Planar Reflections が使用されているか認識するのに便利です。 |
|
詳細なプロパティ |
||
General Show Flags |
一般的な機能表示フラグで、一部の機能とアクタをレンダリングからシーン キャプチャに切り替えるために使用されます。たとえば、アンチエイリアシング、フォグ、スタティックメッシュ、スケルタルメッシュなどです。 |
|
Advanced Show Flags |
一般的な高度な機能表示フラグで、一部の機能とアクタをレンダリングからシーン キャプチャに切り替えるために使用されます。たとえば、フォリッジ、インスタンス化されたスタティックメッシュ、Paper 2D スプライトなどです。 |
|
Post Processing Show Flags |
ブルーム、自動露光、モーション ブラーの表示フラグをレンダリングからシーン キャプチャに切り替えます。 |
|
Light Types Show Flags |
シーン キャプチャへレンダリングされているスカイ ライトの表示フラグをレンダリングからシーン キャプチャに切り替えます。 |
|
Lighting Components Show Flags |
アンビエント オクルージョンとダイナミック シャドウの表示フラグをレンダリングからシーン キャプチャに切り替えます。 |
|
Lighting Features Show Flags |
ライト機能の一般的な表示フラグをレンダリングからシーン キャプチャに切り替えます。たとえば、距離フィールド アンビエント オクルージョン (DFAO)、ライト関数、スクリーン スペース リフレクション (SSR) などです。 |
|
Hidden Show Flags |
ライティングとポストプロセスの表示フラグをレンダリングからシーン キャプチャに切り替えます。 |
平面反射の制約
平面反射を使うとかなり現実的な反射を作成できますが、この機能には以下のような制約があります。
平面反射を使用すると、シーン全体が 2 回レンダリングされるので、レンダリング スレッドと GPU でフレーム時間の半分の時間を割り当てる必要があります。
ワールドに置かれた平面反射数を制限します。1 ではまだ多すぎることが多いです。
適切な大きさにして、見えない時にカリングできるようにします。
レベル内でレンダリング中の負荷が、そのまま Planar Reflection アクタのレンダリングの負荷になります。この機能を有効にすると、負荷はスクリーン比率に合わせてスケールしないので、トライアングルとドローコールのあるシーンではほとんどのパフォーマンス問題が発生します。
平面反射のパフォーマンス
プロジェクトで平面反射を有効にして使用すると鮮明で十分正確な反射を行うことができますが、プロジェクトのパフォーマンスに直接影響がでます。次のセクションでは、平面反射を有効した場合にモバイル デバイスのみならずハイエンド PC プロジェクトにも見られるパフォーマンスの影響を見てみましょう。
Kite & Infinity Blade Grass Lands プロジェクトを使って、平面反射のパフォーマンスに及ぼす影響を説明します。このプロジェクトは Epic Games Laincher の Marketplace から見つけることができます。
平面反射のパフォーマンスと Kite のデモ
Kite Demo のランドスケープ テレインのサイズと変わる高さのために、レベル全体を囲むために単一の Planar Reflection アクタを追加しスケールすると機能しなくなり、パフォーマンスは非常に悪くなります。その代わり、Planar Reflection アクタはそれを必要とするレベルのエリアに合うように戦略的に配置およびスケールします。以下の画像で、Kite デモで使われた水面上で平面反射に与えるビジュアルの影響を確認できます。
平面反射は、レベルの見かけを大胆に変更しますが、パフォーマンスにもかなりの負荷を与えます。左側の 平面反射をオフにした 画像を見ると、レベル全体のレンダリング所要時間は 31 分です。右側の 平面反射をオンにした 画像では、レベル全体のレンダリング所要時間は 29.19 分です。これに平面反射のレンダリングに 23.07 分かかるので、平面反射を有効にした場合のシーンのレンダリングの合計所要時間は 52 分になります。
Kite では完全に動的なライティングとシャドウイングが使われているために、平面反射はレンダリングに 31 分かかります。Planar Reflection に再びレンダリングを行う場合、固定 / 事前計算されたライティングとシャドウイングを使用しているレベルの方がはるかに効率的です。
平面反射のパフォーマンスと Infinity Blade Dungeons
Infinity Blade Elven Ruins マップのサイズとレイアウトの関係で、平面反射は 1 つだけ必要で、レベルに配置された既存の水のスタティックメッシュに合わせてスケールされます。こちらの画像では、平面反射を追加することで Elven Ruins マップ内の水に生じた視覚的な印象をの変化が分かります。
平面反射を追加すると水が生き生きと見えますし、パフォーマンスに及ぼす影響も Kite Demo と比べるとかなり小さいです。左側の平面反射をオフにした画像を見ると、シーンのレンダリング所要時間は 11 分です。右側の平面反射をオンにした画像を見ると、シーンのレンダリング所要時間は 1.67 分なので、レベルのレンダリングには約 13 分かかります。
Elven Ruins マップのレンダリング所要時間が 1.67 分だったのに対して、Kite Demo では 23.07 分になる原因は、Elven Ruins に使用したスタティックメッシュとマテリアルのビルド方法です。Elven Ruins マップとそのコンテンツはモバイル デバイス用に作られています。1 つのアセットに使われているトライアングル数とマテリアル インストラクション数に注意してください。このため、平面反射を Elven Ruins マップで有効にすると、Kite Demo と比べてマップに使用しているアセットの複雑度とサイズが大幅に削減されるので、負荷が低くなります。