テンポラル アップスケールによるスクリーン パーセンテージ

テンポラル アップスケールによるスクリーン パーセンテージの使用に関する概要です。

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

バージョン 4.19 より前の Unreal Engine 4 (UE4) では、スクリーン パーセンテージの変更だけが必要でしたが、4.19 以降では、レンダリングのパイプラインで、プライマリ スペース アップスケールとセカンダリ スペース アップスケールの 2 種類のスケーリングに分割されています。

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

  • セカンダリ スペース アップスケール (Secondary Spatial Upscaling) では、プライマリ用のアップスケール パスとは別に、最終となる 2 度目のスペース アップスケール パスが実行されます。

プライマリ スクリーン パーセンテージ

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

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

NoUpscaling.png

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

SpatialUpscale.png

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

スペース アップスケールの品質

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

    r.Upscale.Quality

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

アップサンプル品質値

アップサンプル結果

0

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

1

シンプルなバイリニア法

2

アンシャープ マスク アップサンプルによる移動ぼかし

3

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

4

タップ数 13 の Lanczos 3

5

タップ数 36 のガウスぼかしによるアンシャープ マスク処理 (非常に負荷が高いが極端なアップサンプリングに適する)

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

    r.Tonemapper.MergeWithUpscale.Mode

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

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

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

SpatialAndTemporalUpsample.png

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

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

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

テンポラル アップスケールの有効化

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

    r.TemporalAA.Upsampling 1

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

スクリーンパーセンテージ:70|テンポラルアップスケール:オフ

スクリーンパーセンテージ:70|テンポラルアップスケール:オン

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

追加の例

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

スクリーンパーセンテージ:70|テンポラルアップスケール:オフ

スクリーンパーセンテージ:70|テンポラルアップスケール:オン

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

スクリーンパーセンテージ:70|テンポラルアップスケール:オン

スクリーンパーセンテージ:100|テンポラルアップスケール:オフ

テクスチャの Automatic View Mip Bias

スクリーン パーセンテージによってジオメトリを低いピクセル密度でレンダリングすることになるため、テンポラル アップスケールは、出力のシャープさを同等に維持するために、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 と同様に、テンポラル アップスケールは、Post Process Quality 3 と 4 のために高速なシェーダーの置換が可能です。シェーダーの置換は、コンソールで 60Hz でタイトルをシッピングするために、一定の品質と引き換えに行われます。品質の設定は、ポスト プロセスの品質の設定と似ています。また、TAAU では、TAAU パスのあとに続くポスト プロセスとともに高い解像度で実行されるため、TAA よりも負荷が高くなることにも注意してください。

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

    r.PostProcessAAQuality

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

次の表では、プライマリ スクリーン パーセンテージの値の範囲ごとに何を期待できるかを示しています。

プライマリ スクリーン パーセンテージの下限

上限

説明

50%

71%

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

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 前の解像度を返します。テンポラル アップスケール後のポスト プロセス マテリアル 後のポストプロセスマテリアル) であっても同様です。

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

ViewportUV-1.png

テンポラル アップスケール後のポスト プロセス マテリアル

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

BlendableLocation.png

View Property 表現式のビュー サイズとレンダリング ターゲット サイズは TAAU の後ですが、ビューの解像度は TAAU の前に返されます。PostProcessInput0 を使った Scene Texture 表現式が SizeInvSize 用の出力を使って TAAU 後のビュー サイズとテクセルの UV サイズを理解します。

ViewProperty.png

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

ScreenPosFromPixelPos.png

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

セカンダリ スペース アップスケール

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

プライマリ スペース アップスケールとは異なり、セカンダリ スペース アップスケールは静的です。ゲーム内で動的に変更することはできません。

PrimaryAndSecondaryScreenPercentageUpscale.png

コンフィギュレーション (.ini) ファイルで次のコンソール変数を使ってセカンダリ スクリーン パーセンテージを設定できます。

    r.SecondaryScreenPercentage.GameViewport

バックバッファの解像度が 1080p だとわかっていれば、900p という低い解像度をターゲットにできます。そのために、セカンダリ スクリーン パーセンテージに割合を入力します。

    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

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

エディタ のビューポートの DPI スケーリング

エディタ での作業中、すべてのビューポートは、100 を OS の DPI スケールで割った、セカンダリ スクリーン パーセンテージでレンダリングされます。次の式でセカンダリ スクリーン パーセンテージが決定されます。

    SecondaryScreenPercentage = 100 / OS's DPI Scale

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

DPIEditorViewportScaling.png

このオプションの変更から影響を受けるのはエディタとゲームのビルドのセカンダリ スクリーン パーセンテージのみで、それらがデフォルトの 100% になります。

VR ピクセル密度

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

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

vr.PixelDensity

VRPixelDensity.png

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

詳細については「4.19 から大きく変わる VR 解像度の調節方法」を参照してください。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル