画面パーセントと Temporal Upsample

Unreal Engine 4 での画面パーセントと Temporal Upsample の概要を説明します。

Windows
MacOS
Linux

Unreal Engine 4.19 のリリースで、画面パーセントの仕組みがいくつかの点で大きく変更されました。この変更の大部分が直接影響するのは、仮想現実 (VR) プロジェクトの開発者です。多くの場合で後方互換性がなくなります。

画面パーセント は、実際の表示よりも低いあるいは高い解像度の画像をレンダリングするために、解像度をスケールする技術です。画面パーセントを調整できるため、ゲームでパフォーマンスと画像の解像度の品質のバランスを取ることができます。

バージョン 4.19 より前の Unreal Engine 4 (UE4) では、画面パーセントの変更だけが必要でしたが、4.19 以降では、レンダリングのパイプラインで、Primary Spatial Upscaling と Secondary Spatial Upscaling の 2 種類のスケーリングに分割されています。

  • Primary Spatial Upscaling は、これまで使われてきたものと同じ画面パーセントです。フレームを低解像度でレンダリングし、ユーザー インターフェイス (UI) を描画する前にアップスケールするという考え方に基づいています。

  • Secondary Spatial Upscaling では、Primary のアップスケール パスとは別に、最終となる 2 度目の Spatial Upscale パスが実行されます。

Primary Screen Percentage

Primary Spatial Upscale (または primary screen percentage) は、画面パーセントで画面の解像度をレンダリングしてから、現在の画面の解像度に合うようにスケーリングします。低い画面パーセント (または低い解像度) を使ってからアップスケールすることを、アップサンプリングと言います。また、高い画面パーセント (高い解像度でのレンダリング) を使ってから現在の画面の解像度にスケール ダウンすることを、 スーパー サンプリング と言います。これらの処理は UI を描画する前に行われるので、パフォーマンスに影響を与えることがあります。

1 つの GPU フレームで画面にレンダリングされる画像を構成するすべてのバッファ レンダー ターゲットに対して画面パーセントがどう動作するのか、以下でその概念を説明します。

NoUpscaling.png

各 GPU フレームで、すべてのレンダー ターゲットは、パイプライン全体を通じてフル解像度を使用します。

SpatialUpscale.png

Spatial Upscaling を行うと、UI の前に描画されるものはすべて、使用される画面パーセントに基づいて解像度が低くなったり高くなったりします。(図で UI の前のレンダー ターゲットが小さくなっていることが示すように) 画面パーセントが下げられ、レンダー ターゲット用に低解像度の画像が作成されます。UI の前に Spatial Scaling が行われ、出力先の画面の解像度に合わせて画像がスケールされます。たとえば、現在の解像度が 1920x1080 で、画面パーセントが 83% であった場合、レンダー ターゲットは近似の解像度 1600x900 にリサイズされてから、1920x1080 にアップスケールされます。

Spatial Upscale の品質

レンダー ターゲットをアップスケールするときの品質は、次のコンソール変数で定義できます。

r.Upscale.Quality

このコンソール変数は、画面パーセントと Windowed Fullscreen モードが 3D レンダリングをスケールする品質を制御します。

アップサンプル品質を示す値

アップサンプルの結果

1

ニアレスト フィルタリング

2

シンプルなバイリニア

3

アンシャープ マスク アップサンプルによる指向性ブラー

4

5 タップの Catmull-Rom バイキュービック、Lanczos2 の近似 (デフォルト)

5

13 タップの Lanczos3

6

36 タップのガウスぼかしによるアンシャープ マスク (非常に負荷が高いが極端なアップサンプルに有効)

また、次のコンソール変数を使って、トーンマッパ パスの処理方法を制御できます。

r.Tonemapper.MergeWithUpscale.Mode

値を 1 にして有効にすると、シンプルなバイリニア色空間 spatial upscale をトーンマッパが統合してパフォーマンス改善のために使用できます。ただし、トーンマッパのあとにポスト プロセス マテリアルが挿入されても、トーンマッパはアップスケールを行いません。無効にされた場合と同様に、フォールバックして primary spatial upscale を使用します。

テンポラル アンチエイリアシングのアップサンプル

primary screen percentage のために使用できるアップスケール技術として、Primary Spatial Upscale のほかにTemporal Upsample がサポートされています。テンポラル アンチエイリアシング (TAA) と一時的に統合してから Primary spatial upscale を行うのではなく、テンポラル アンチエイリアシング アップサンプル (TAAU) シェーダーで同時に処理されます。spatial upscale のみを使用する場合よりもシャープな画像になりますが、大量のポスト プロセスを高解像度で実行することになるので、負荷は高くなります。primary screen percentage の変更を動的解像度に対して隠蔽することもできます。こうすると、できるかぎり GPU の割り当てに対応するように、primary screen percentage を頻繁に変更できるようになります。

SpatialAndTemporalUpsample.png

TAAU はパイプラインの早い段階で行われるため、レンダーに続くパスの解像度が高くなり、負荷は高く、画像はシャープになります。

Temporal Upsample を使う場合、TAAU を追加してもさまざまなポスト プロセスの順序は変わらず、ただ TAA を置き換えます。異なる点は、TAAU より前のプロセスでは解像度が低くなり、TAAU のパスのあとで解像度がアップサンプルされるところです。バージョン 4.19 より前では、解像度はポスト プロセス全体で同じであると想定できました。

primary screen percentage が低下すると、出力がクリーンなフル解像度から変化します。そのため、既存の TAA アーティファクトが目立つようになります。たとえば、非常に薄いジオメトリでエイリアシングが問題になることがあります。primary screen percentage が低下すると、ジオメトリのディテールが失われる可能性が高くなります。

Temporal Upsample の有効化

テンポラル アンチエイリアシングのアップサンプルを使用するには、プロジェクト設定で Temporal Upsampling を選択するか、次のコンソール変数を使用します。

r.TemporalAA.Upsampling 1

spatial upscale を使っていて primary screen percentage が低くなると、解像度が低いときにディテールの多くが失われる可能性があります。たとえば、金網塀や自動車のフロント グリルでは、テンポラル アンチエイリアシングを使用すると、離れたところからはディテールが見辛くなることがあります。TAAU を有効にすると、画面パーセントが低くてもこの問題は緩和されます。

Screen Percentage: 70 | Temporal Upsample: Disabled

Screen Percentage: 70 | Temporal Upsample: Enabled

繰り返しの多いジオメトリやマテリアルに TAA がどう影響するかわかりやすく示すために、primary screen percentage を 70 に設定して、カメラを遠くに移動してあります。Temporal Upsample により、低解像度でも可能なかぎりディテールを維持して、見えやすくすることができます。

追加サンプル

最初の比較セットでは、画面パーセントを下げただけのデフォルトのシーンと、同じ画面パーセントで Temporal Upsample を有効にしたシーンを比較しています。ここに挙げたスクリーンショットでは些細な違いのように思えるかもしれませんが、密度の高いジオメトリや繰り返しの多いテクスチャを使ったエリアがある大規模なシーンでは、失われたディテールの一部を取り戻すことができます。たとえば、建物の屋上にあるフェンスや、植物の葉 (近くのものと遠くのもの) で違いが出ます。

Screen Percentage: 70 | Temporal Upsample: Disabled

Screen Percentage: 70 | Temporal Upsample: Enabled

次に、画面パーセントがデフォルトの 100 % で Temporal Upsample を使っていない場合と、画面パーセントが低く Temporal Upsample を使っている場合を比較しています。スペキュラの光る部分とマテリアルのディテールの一部は失われていますが、Temporal Upsample は、画面パーセントが低くなった場合でも、ジオメトリのディテールをうまく維持しています。

Screen Percentage: 70 | Temporal Upsample: Enabled

Screen Percentage: 100 | Temporal Upsample: Disabled

テクスチャの Automatic View Mip Bias

画面パーセントによってジオメトリを低いピクセル密度でレンダリングすることになるため、Temporal Upsample は、出力のシャープさを同等に維持するために、SurfaceDeferred Decal のマテリアル ドメインから、より多くのテクスチャの情報を取得する必要があります。このために、Texture Sample 表現式はデフォルトで Automatic View Mip Bias を使用できます。

Texture Sample 表現式は Automatic View Mip Bias を使用して、テンポラル アンチエイリアシングでの出力をシャープにするためにテクスチャがビュー単位のミップ バイアスを使ってサンプルされるかどうかを切り替えます。

AutomaticViewMipBias.png

(下の例のように) 繰り返しが多いテクスチャでは、画面パーセントが低いときに自動ミップ バイアスを使うと問題になることがあります。

HFtexture.png

その場合、ミップ バイアスの入力を補ったり、Automatic View Mip Bias を無効にしたりすることができます。

AutomaticViewMipBiasUnchecked.png

Automatic View Mip Bias は、TAAU が有効なときにのみ実行されます。通常のアンチエイリアシング方法 (TAA、MSAA、FXAA) ではこのオプションを使用できません。

アンチエイリアスの品質調整のためのシェーダーのパフォーマンスの置換

TAA と同様に、Temporal Upsample は、Post Process Quality 3 と 4 のために高速なシェーダーの置換が可能です。シェーダーの置換は、コンソールで 60Hz でタイトルをシッピングするために、一定の品質と引き換えに行われます。品質の設定は、ポスト プロセスの品質の設定と似ています。また、TAAU では、TAAU パスのあとに続くポスト プロセスとともに高い解像度で実行されるため、TAA よりも負荷が高くなることにも注意してください。

ポスト プロセスの品質を調整するために次のコンソール変数を使用できます。

r.PostProcessAAQuality

Temporal Upsample のあとのポスト プロセスは、フル解像度で実行されます。TAA を無効にすると、Spatial Upscaling が最後に実行されるので、ポスト プロセスはより低い解像度で実行され、処理が高速になります。profileGPU コマンドを使用すると、GPU パフォーマンスの内訳をパス単位で調査できます。現在使用されているパス、割り当て時間が最も多く使われているところがわかります。

次の表では、primary screen percentage の値の範囲ごとに何を期待できるかを示しています。

primary screen percentage の下限

上限

説明

50%

71%

小さなローカル データ ストレージ (LDS) タイルをメモリ内で使用するので、最もパフォーマンスに優れたアプローチです。デスクトップとコンソールで 4K をターゲットに Temporal Upsample を行う場合に適しています。

71%

100%

デスクトップとコンソールで通常の DPI でレンダリングする場合に適しています。

100%

200%

レンダー ターゲットで GPU のメモリが制限にならなければ、Dynamic Resolution で理論上は 100% 以上に到達できる可能性があります。

マテリアルの改善

マテリアルが Scene Texture 表現式を使用してシーンをサンプリングする方法が一部改善されました。シンプルになり、ビューのサイズが使用されるレンダー ターゲットと常に同じになるようになりました。Screen Position 表現式には新しい出力があり、ビュー サイズ内でピクセルの位置を正確にできるようになりました。TAAU のあとにポスト プロセス マテリアルを使用する場合、いくつか追加の考慮事項があります。

ビュー サイズとレンダー ターゲットのサイズ

ビューサイズはマテリアル内のレンダー ターゲットのサイズと常に等しくなります。UE4 のバージョン 4.19 より前では、シーンのテクスチャをサンプリングする際、マテリアルは、ビューポート UV とは異なるシーン テクスチャ UV の複雑さにも対処する必要がありました。たとえば、Screen Position 表現式は、これらの値の両方を出力し、ビュー プロパティはレンダー ターゲットのサイズを公開しますが、これはビュー サイズと等しいとは限りません。レンダラは実際にはビューポートをより大きなレンダー ターゲットにレンダリングしている可能性があるからです。

クリックしてフルサイズ表示

複雑さを取り除くと、マテリアルは常にレンダー ターゲット サイズがビュー サイズと等しいかのように機能します。Screen Position 表現式は常にビューポート UV を返し、Scene Texture 表現式がそのビューポート UV を入力として取ります。

ScreenPosViewportUVMat.png

Screen Position 表現式が Scene Texture 表現式に対して ViewportUV のサイズを返すようにする設定例

Screen Position の精度が高い Pixel Position 出力

Screen Position 表現式に、2 つめの入力 Pixel Position が追加されました。これは Viewport UV にパスのサイズを乗算したものです。ビュー プロパティのビュー サイズは常に TAAU 前の解像度を返します。Temporal Upsample 後のポスト プロセス マテリアル であっても同様です。

Pixel Position は、マテリアルにビュー サイズ内の正確なピクセルの位置を伝えるために使用されます。これは TAA と同期されるカスタムのピクセル ディザリングなどのエフェクトに重要です。次に、ビューポート UV の計算方法の例を示します。

ViewportUV-1.png

Temporal Upsample 後のポスト プロセス マテリアル

ポスト プロセス マテリアルを作成する際には、使用するブレンド可能な位置を選択できます。[After Tonemapping][Replacing the Tonemapper] の位置は、パイプラインで TAAU のあとになります。つまり、実際にはフル解像度で実行され、ビュー サイズとは異なります。

BlendableLocation.png

View Property 表現式の[View Size] と [Render Target Size] は、TAAU 後であっても、引き続き TAAU 前のビューの解像度を返します。TAAU 後のビュー サイズとテクセル UV のサイズを知るために、PostProcessInput0 を使用する Scene Texture 表現式は、[Size][InvSize] の出力を使用できます。

ViewProperty.png

[Pixel Position] を利用してビューポート UV を再計算するには、次のようにします。

ScreenPosFromPixelPos.png

Scene Texture 表現式がビューポート UV のみを受け付けるようになったので、任意のシーン テクスチャをサンプリングできるようになり、UV ビューポートの変換時にエラーが起きることはなくなりました。

Secondary Spatial Upscale

Primary Spatial Upscale に加えて、TAAU パスのあとで Secondary Spatial Upscale が行われます。DPI の高いモニターでは、これが問題になることがあります。高解像度でレンダリングされるシーンの複雑さによっては、GPU が対応できなくなることがあります。そこで、レンダラは、最終となる 2 番目のアップスケール パスを推進する secondary screen percentage の利用をサポートしています。このパスは primary screen percentage とは独立したものです。

primary spatial upscale とは異なり、secondary spatial upscale は静的です。ゲーム内で動的に変更することはできません。

PrimaryAndSecondaryScreenPercentageUpscale.png

コンフィギュレーション (.ini) ファイルで次のコンソール変数を使って secondary screen percentage を設定できます。

r.SecondaryScreenPercentage.GameViewport

バックバッファの解像度が 1080p だとわかっていれば、900p という低い解像度をターゲットにできます。そのために、secondary screen percentage に割合を入力します。

Target Resolution / Currently Set Resolution * 100 = Secondary Screen Percentage
900 / 1080 * 100 = 0.8333 * 100 = 83.33

たとえば Xbox One でのフォートナイト バトルロイヤルで 60Hz をターゲットとする場合、83.33 という値を使い、次のように設定します。

[XboxOne_60 DeviceProfile]
DeviceType=XboxOne
BaseProfileName=XboxOne
+CVars=r.SecondaryScreenPercentage.GameViewport=83.33

secondary screen percentage をコンフィギュレーション ファイルに追加すると、Editor と対象となるプラットフォームで設定をオーバーライドします。また、コンソール変数 r.SetRes を使うとバックバッファの解像度を制御できます。1080p または 4k のままにしておいて、UI が常に対象プラットフォームのネイティブ解像度でレンダリングされるようにすることをお勧めします。

Editor のビューポートの DPI スケーリング

Editor での作業中、すべてのビューポートは、100 を OS の DPI スケールで割った、secondary screen percentage でレンダリングされます。次の式で secondary screen percentage が決定されます。

SecondaryScreenPercentage = 100 / OS's DPI Scale

高 DPI モニター向けには、シーンのスケーリング (品質) が調整されて、非常に大きなレンダー ターゲットでも安定したパフォーマンスを出せるようにします。また、Editor がクラッシュして作業が失われることがないように、システムの GPU にとって大きすぎる中間レンダー ターゲットの割り当てを防ぎます。デフォルトでは、Editor は高 DPI モニター向けにシーンのスケーリングを調整して、ピクセル密度が高くても安定したパフォーマンスを発揮できるようにします。ただし、エディタの環境設定で [Disable DPI Based Editor Viewport Scaling] を設定することで、この挙動はカスタマイズできます。この設定を使用すると、secondary screen percentage はデフォルトの 100 になり、Editor のすべてのビューポートでフル解像度でレンダリングします。

DPIEditorViewportScaling.png

このオプションの変更から影響を受けるのは Editor とゲームのビルドの secondary screen percentage のみで、それらがデフォルトの 100% になります。

VR のピクセル密度

Unreal Engine 4.19 より前では、ヘッド マウント ディスプレイ (HMD) の画面で VR プロジェクトをレンダリングする解像度を、画面パーセントのコンソール変数を使用して決定していました。多くの場合、これはマジック ナンバーであり、プロジェクトの表示に使用する HMD に応じて調整 (して記憶) する必要がありました。

最近のバージョンでは、画面の解像度は Pixel Density で制御されます。画面パーセントにマジック ナンバーを使用する必要がなくなり、複数の HMD 向けの開発がしやすくなりました。デフォルトでは、通常は画面がぼやけることにつながるアップスケーリングを HMD のコンポジタが行う必要がないように、それぞれの目のビューが HMD の推奨解像度でレンダリングされます。画面の推奨解像度よりも高いあるいは低いピクセル密度を指定するには、次のコンソール変数を使用します。

vr.PixelDensity

VRPixelDensity.png

上の図では、HMD にとって理想的な解像度が使用されていて、VR Pixel Density によって必要に応じて HMD の理想的な解像度から任意の値だけ上げ下げして調整できるようになっていることが示されています。この変更は、ビューの解像度へと Temporal Upscale を行いパイプライン内で HMD のコンポジタに渡す処理とは独立した primary screen percentage の制御を可能にします。

詳細については、VR のピクセル密度 をご覧ください。

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信