Copyright (c) 2023 Advanced Micro Devices, Inc. 無断複写・転載を禁じます。
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件に従って、ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、およびソフトウェアが提供される人にそのことを許可することはできません。上記の著作権表示とこの許可通知は、すべてのコピーに含まれるものとします。またはソフトウェアの重要な部分。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。
FSR2 は、時間的フィードバックを使用して、ネイティブ レンダリングと比較して画質を維持し、さらには向上させながら、高解像度の画像を再構築します。
FSR2 は、ハードウェア レイ トレーシングなど、コストのかかるレンダリング操作で「実用的なパフォーマンス」を実現できます。
HLSL
CS_6_2
CS_6_6*
* - CS_6_6 は、64 幅のウェーブフロントをサポートする一部のハードウェアで使用されます。
FSR2 を使用するには、次の手順に従う必要があります。
build
ディレクトリ内のGenerateSolutions.bat
をダブルクリックします。
API に一致するソリューションを開き、ソリューションをビルドします。
API ライブラリをbin/ffx_fsr2_api
から、サードパーティ ライブラリを含むプロジェクト内のフォルダーが含まれるフォルダーにコピーします。
使用する FSR2 バックエンドに一致するライブラリをコピーします (例: DirectX12 の場合はbin/ffx_fsr2_api/ffx_fsr2_api_dx12_x64.lib
。
次のコア API ヘッダー ファイルを src/ffx-fsr2-api からプロジェクトにコピーします: ffx_fsr2.h
、 ffx_types.h
、 ffx_error.h
、 ffx_fsr2_interface.h
、 ffx_util.h
、 shaders/ffx_fsr2_common.h
、およびshaders/ffx_fsr2_resources.h
。ファイルのコピー先で相対ディレクトリ構造を維持するように注意する必要があります。
選択した API バックエンドのヘッダー ファイルをコピーします。たとえば、DirectX12 の場合は、 dx12/ffx_fsr2_dx12.h
およびdx12/shaders/ffx_fsr2_shaders_dx12.h
をコピーします。ファイルのコピー先で相対ディレクトリ構造を維持するように注意する必要があります。
FSR2 と対話するコードベースにffx_fsr2.h
ヘッダー ファイルを含めます。
ターゲット API のバックエンドを作成します。たとえば、DirectX12 の場合は、 ffxFsr2GetInterfaceDX12
を呼び出す必要があります。スクラッチ バッファには、 ffxFsr2GetScratchMemorySizeDX12
呼び出しによって返されるサイズが割り当てられ、そのバッファへのポインタがffxFsr2GetInterfaceDX12
に渡される必要があります。
ffxFsr2ContextCreate
を呼び出して FSR2 コンテキストを作成します。パラメータ構造は、アプリケーションの構成に合わせて入力する必要があります。詳細については、API リファレンス ドキュメントを参照してください。
FSR2 ワークロードを起動するには、各フレームでffxFsr2ContextDispatch
を呼び出す必要があります。パラメータ構造は、アプリケーションの構成に合わせて入力する必要があります。詳細については API リファレンス ドキュメントを参照し、 frameTimeDelta
フィールドがミリ秒単位で指定されていることを確認してください。
アプリケーションを終了するとき (または別の理由でコンテキストを破棄したいとき) は、 ffxFsr2ContextDestroy
を呼び出す必要があります。この関数を呼び出す前に、GPU はアイドル状態である必要があります。
サブピクセル ジッタリングは、アプリケーションの投影行列に適用する必要があります。これは、アプリケーションのメインレンダリングを実行するときに行う必要があります。正確なジッター オフセットを計算するには、 ffxFsr2GetJitterOffset
関数を使用する必要があります。詳細については、「カメラのジッター」セクションを参照してください。
最高のアップスケーリング品質を得るには、ガイドラインに従ってリアクティブ マスクと透明性と合成マスクを設定することを強くお勧めします。開始点としてffxFsr2ContextGenerateReactiveMask
使用することもできます。
アプリケーションは、ユーザー インターフェイスで、品質、バランス、パフォーマンス、および (オプションで) ウルトラ パフォーマンスの順序でスケーリング モードを公開する必要があります。
アプリケーションは、エンド ユーザーがさらなる品質を達成できるように、シャープ化スライダーも公開する必要があります。
エンド ユーザーの利便性を考慮して、FSR2 API には名前付きのプリセット スケーリング比が多数用意されています。
品質 | 次元ごとのスケーリング係数 |
---|---|
品質 | 1.5倍 |
バランスの取れた | 1.7倍 |
パフォーマンス | 2.0倍 |
ウルトラパフォーマンス | 3.0倍 |
アプリケーションのユーザー インターフェイスで一貫した名前付けとスケーリング比率を採用することを強くお勧めします。これは、FSR2 を使用する他のアプリケーションの経験を持つアプリケーションのユーザーに対して、ユーザー エクスペリエンスが一貫していることを保証するためです。
ターゲット ハードウェアと動作構成に応じて、FSR2 は異なるパフォーマンス レベルで動作します。
以下の表は、DX12 のさまざまなハードウェア上で測定された FSR2 のパフォーマンスをまとめたものです。
ターゲット解像度 | 品質 | RX7900XTX | RX6950XT | RX6900XT | RX6800XT | RX6800 | RX6700XT | RX6650XT | RX5700XT | RXベガ56 | RX590 |
---|---|---|---|---|---|---|---|---|---|---|---|
3840x2160 | 品質 (1.5x) | 0.7ミリ秒 | 1.1ミリ秒 | 1.2ミリ秒 | 1.2ミリ秒 | 1.4ミリ秒 | 2.0ミリ秒 | 2.8ミリ秒 | 2.4ミリ秒 | 4.9ミリ秒 | 5.4ミリ秒 |
バランス型 (1.7x) | 0.6ミリ秒 | 1.0ミリ秒 | 1.0ミリ秒 | 1.1ミリ秒 | 1.4ミリ秒 | 1.8ミリ秒 | 2.6ミリ秒 | 2.2ミリ秒 | 4.1ミリ秒 | 4.9ミリ秒 | |
パフォーマンス (2x) | 0.6ミリ秒 | 0.9ミリ秒 | 1.0ミリ秒 | 1.0ミリ秒 | 1.3ミリ秒 | 1.7ミリ秒 | 2.3ミリ秒 | 2.0ミリ秒 | 3.6ミリ秒 | 4.4ミリ秒 | |
ウルトラパフォーマンス。 (3x) | 0.5ミリ秒 | 0.8ミリ秒 | 0.8ミリ秒 | 0.9ミリ秒 | 1.1ミリ秒 | 1.5ミリ秒 | 1.8ミリ秒 | 1.7ミリ秒 | 2.9ミリ秒 | 3.7ミリ秒 | |
2560x1440 | 品質 (1.5x) | 0.3ms | 0.5ミリ秒 | 0.5ミリ秒 | 0.5ミリ秒 | 0.7ミリ秒 | 0.9ミリ秒 | 1.2ミリ秒 | 1.1ミリ秒 | 1.9ミリ秒 | 2.3ミリ秒 |
バランス型 (1.7x) | 0.3ms | 0.5ミリ秒 | 0.5ミリ秒 | 0.5ミリ秒 | 0.6ミリ秒 | 0.8ミリ秒 | 1.1ミリ秒 | 1.0ミリ秒 | 1.7ミリ秒 | 2.1ミリ秒 | |
パフォーマンス (2x) | 0.3ms | 0.4ミリ秒 | 0.4ミリ秒 | 0.4ミリ秒 | 0.6ミリ秒 | 0.8ミリ秒 | 0.9ミリ秒 | 0.9ミリ秒 | 1.5ミリ秒 | 1.9ミリ秒 | |
ウルトラパフォーマンス。 (3x) | 0.2ミリ秒 | 0.4ミリ秒 | 0.4ミリ秒 | 0.4ミリ秒 | 0.5ミリ秒 | 0.7ミリ秒 | 0.8ミリ秒 | 0.8ミリ秒 | 1.2ミリ秒 | 1.7ミリ秒 | |
1920x1080 | 品質 (1.5x) | 0.2ミリ秒 | 0.3ms | 0.3ms | 0.3ms | 0.4ミリ秒 | 0.5ミリ秒 | 0.6ミリ秒 | 0.6ミリ秒 | 1.0ミリ秒 | 1.3ミリ秒 |
バランス型 (1.7x) | 0.2ミリ秒 | 0.3ms | 0.3ms | 0.3ms | 0.4ミリ秒 | 0.5ミリ秒 | 0.6ミリ秒 | 0.6ミリ秒 | 0.9ミリ秒 | 1.2ミリ秒 | |
パフォーマンス (2x) | 0.2ミリ秒 | 0.2ミリ秒 | 0.2ミリ秒 | 0.3ms | 0.3ms | 0.5ミリ秒 | 0.5ミリ秒 | 0.5ミリ秒 | 0.8ミリ秒 | 1.1ミリ秒 | |
ウルトラパフォーマンス。 (3x) | 0.1ms | 0.2ミリ秒 | 0.2ミリ秒 | 0.2ミリ秒 | 0.3ms | 0.4ミリ秒 | 0.4ミリ秒 | 0.4ミリ秒 | 0.7ミリ秒 | 0.9ミリ秒 |
数値は最も近い 0.1 ミリ秒に四捨五入されており、追加のsharpness
含まれていないため、変更される可能性があります。
FSR2 を使用するには、GPU による消費のために追加の GPU ローカル メモリを割り当てる必要があります。 FSR2 API を使用する場合、このメモリは FSR2 コンテキストの作成時に割り当てられ、バックエンド インターフェイスを構成する一連のコールバックを介して割り当てられます。このメモリは、FSR2 アルゴリズムによって計算される中間サーフェスと、アプリケーションの多くのフレームにわたって永続的なサーフェスを格納するために使用されます。以下の表には、さまざまな動作条件下で FSR2 によって使用されるメモリの量が含まれています。 「ワーキング セット」列は、アルゴリズムが GPU で実行されているときに FSR2 によって使用されるメモリの合計量を示します。これは、FSR2 の実行に必要なメモリの量です。 「永続メモリ」列は、アプリケーションの後続のフレームのために「ワーキング セット」列をそのままにしておく必要がある量を示します。このメモリには、FSR2 によって消費される一時データが保存されます。 「エイリアス可能なメモリ」列は、FSR2 の動作境界外でアプリケーションによって使用されるサーフェスまたはその他のリソースによって「ワーキング セット」列のどの程度がエイリアス化される可能性があるかを示します。
FSR2 バックエンド インターフェイスのリソース作成および破棄部分をオーバーライドし、エイリアシング フラグを転送することで、FSR2 でのリソース作成を制御できます。これは、FSR2 を完全に統合するには、動作条件に応じて、以下の表の「永続メモリ」列に等しい追加メモリが必要であることを意味します。
解決 | 品質 | ワーキングセット(MB) | 永続メモリ (MB) | エイリアス可能なメモリ (MB) |
---|---|---|---|---|
3840x2160 | 品質 (1.5x) | 448MB | 354MB | 93MB |
バランス型 (1.7x) | 407MB | 330MB | 77MB | |
パフォーマンス (2x) | 376MB | 312MB | 63MB | |
ウルトラパフォーマンス (3x) | 323MB | 281MB | 42MB | |
2560x1440 | 品質 (1.5x) | 207MB | 164MB | 43MB |
バランス型 (1.7x) | 189MB | 153MB | 36MB | |
パフォーマンス (2x) | 172MB | 143MB | 29MB | |
ウルトラパフォーマンス (3x) | 149MB | 130MB | 19MB | |
1920x1080 | 品質 (1.5x) | 115MB | 90MB | 24MB |
バランス型 (1.7x) | 105MB | 85MB | 20MB | |
パフォーマンス (2x) | 101MB | 83MB | 18MB | |
ウルトラパフォーマンス (3x) | 84MB | 72MB | 11MB |
数値は、DX12 の RX 6700XT GPU を使用した場合に最も近い MB に切り上げられた近似値であり、変更される可能性があります。
FSR2 のメモリ要件を管理する方法の詳細については、このドキュメントのメモリ管理に関するセクションを参照してください。
FSR2 は時間アルゴリズムであるため、現在のフレームと前のフレームの両方からのデータにアクセスする必要があります。次の表は、FSR2 に必要なすべての外部入力を列挙しています。
解像度列は、データが「レンダリング」解像度である必要があるか、「プレゼンテーション」解像度である必要があるかを示します。 「レンダリング」解像度は、リソースがアプリケーションがレンダリングを実行する解像度と一致する必要があることを示します。逆に、「プレゼンテーション」は、ターゲットの解像度がユーザーに表示される解像度と一致する必要があることを示します。すべてのリソースは現在レンダリングされているフレームからのものであり、DirectX(R)12 および Vulkan(R) アプリケーションの場合は、
ffxFsr2ContextDispatch
を呼び出す前に、すべての入力リソースをそれぞれD3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE
およびVK_ACCESS_SHADER_READ_BIT
に移行する必要があります。
名前 | 解決 | 形式 | タイプ | 注意事項 |
---|---|---|---|---|
カラーバッファ | 与える | APPLICATION SPECIFIED | テクスチャ | アプリケーションによって提供される現在のフレームのレンダリング解像度カラー バッファー。カラー バッファーの内容がハイ ダイナミック レンジ (HDR) にある場合、 FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE フラグをFfxFsr2ContextDescription 構造体のflags フィールドに設定する必要があります。 |
デプスバッファ | 与える | APPLICATION SPECIFIED (1x FLOAT) | テクスチャ | アプリケーションによって提供される現在のフレームのレンダリング解像度深度バッファー。データは単一の浮動小数点値として提供される必要があり、その精度はアプリケーションの制御下にあります。深さの設定は、 FfxFsr2Context 作成時にFfxFsr2ContextDescription 構造体のflags フィールドを介して FSR2 に伝達される必要があります。深度バッファーが反転している場合 (つまり、[1..0] の範囲) にはFFX_FSR2_ENABLE_DEPTH_INVERTED フラグを設定する必要があり、深度バッファーに無限遠平面がある場合にはFFX_FSR2_ENABLE_DEPTH_INFINITE フラグを設定する必要があります。アプリケーションがD32S8 形式で深度バッファを提供する場合、FSR2 はバッファのステンシル コンポーネントを無視し、深度バッファをアドレス指定するためのR32_FLOAT リソースを作成します。 GCN および RDNA ハードウェアでは、深度バッファーはステンシル バッファーとは別に保存されます。 |
動きベクトル | レンダリングまたはプレゼンテーション | APPLICATION SPECIFIED (2x FLOAT) | テクスチャ | アプリケーションによって [ (<-width, -height> .. <width, height> ] 範囲で提供される現在のフレームの 2D モーション ベクトル。アプリケーションが異なる範囲のモーション ベクトルをレンダリングする場合は、次のmotionVectorScale フィールドを使用できます。 FfxFsr2DispatchDescription 構造体を使用して、FSR2 の予期される範囲に一致するように調整します。内部的には、FSR2 は多くの場合、動きベクトルを表すために 16 ビット量を使用します。より高い精度を提供できる場合でも、 FfxFsr2Context の作成時にFFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS フラグがFfxFsr2ContextDescription 構造体のflags フィールドに設定されていない限り、FSR2 は精度の向上による恩恵を受けられません。この場合、プレゼンテーション解像度と同じにする必要があります。 |
リアクティブマスク | 与える | R8_UNORM | テクスチャ | レンダリングされたイメージの一部の領域は深度バッファーにフットプリントを残さない、または動きベクトルを含むため、FSR2 はそのような領域がどこにあるかを FSR2 に示すために使用できるリアクティブ マスク テクスチャのサポートを提供します。これらの良い例は、深度ベクトルや動きベクトルを書き込まないパーティクル、またはアルファ ブレンドされたオブジェクトです。このリソースが設定されていない場合、FSR2 のシェーディング変化検出ロジックはこれらのケースを可能な限り最善の方法で処理しますが、最適な結果を得るには、このリソースを設定する必要があります。リアクティブ マスクの詳細については、「リアクティブ マスク」セクションを参照してください。 |
暴露 | 1x1 | R32_FLOAT | テクスチャ | 現在のフレームに対して計算された露出値を含む 1x1 テクスチャ。このリソースはオプションであり、 FfxFsr2Context 作成時にFFX_FSR2_ENABLE_AUTO_EXPOSURE フラグがFfxFsr2ContextDescription 構造体のflags フィールドに設定されている場合は省略できます。 |
動きベクトルを除き、レンダリング解像度で提供されるすべての入力は、ジッターを使用してレンダリングする必要があります。 FFX_FSR2_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION
フラグが存在しない限り、モーション ベクトルにはジッターを適用しないでください。
FSR2 では、反転された無限深度バッファーを使用することを強くお勧めします。ただし、代替の深度バッファ構成がサポートされています。アプリケーションは、 FfxFsr2Context
の作成中に適切なフラグを設定することで、FSR2 API に深度バッファ構成を通知する必要があります。以下の表には、適切なフラグが含まれています。
FSR2フラグ | 注記 |
---|---|
FFX_FSR2_ENABLE_DEPTH_INVERTED | 提供された入力深度バッファー データが反転されていることを示すビット [最大..0]。 |
FFX_FSR2_ENABLE_DEPTH_INFINITE | 提供された入力深度バッファー データが無限遠平面を使用していることを示すビット。 |
時間アルゴリズム (アンチエイリアシングまたはアップスケーリング) の重要な部分は、動きベクトルの提供です。 FSR2 は、現在のフレームのピクセルから前のフレームの同じピクセルの位置までの動きをエンコードする 2D の動きベクトルを受け入れます。 FSR2 は、動きベクトルがアプリケーションによって [ <-width, -height> .. <width, height> ] の範囲で提供されることを期待します。これは画面スペースと一致します。たとえば、値が <width, height> である画面の左上隅のピクセルのモーション ベクトルは、右下隅を起点として入力サーフェスの幅と高さ全体を横切るモーションを表します。 。
アプリケーションが別の空間 (正規化されたデバイス座標空間など) でモーション ベクトルを計算する場合、 FfxFsr2DispatchDescription
構造体のmotionVectorScale
フィールドを使用して、FSR2 の予期される範囲に一致するように調整するように FSR2 に指示できます。以下のコード例は、動きベクトルを画面空間に合わせてスケーリングする方法を示しています。以下の HLSL および C++ コードの例は、FSR2 ホスト API を使用して NDC 空間の動きベクトルをスケーリングする方法を示しています。
// GPU: Example of application NDC motion vector computation
float2 motionVector = (previousPosition.xy / previousPosition.w) - (currentPosition.xy / currentPosition.w);
// CPU: Matching FSR 2.0 motionVectorScale configuration
dispatchParameters.motionVectorScale.x = ( float )renderWidth;
dispatchParameters.motionVectorScale.y = ( float )renderHeight;
内部的には、FSR2 は多くの場合、16 ビット量を使用して動きベクトルを表現します。つまり、より高い精度の動きベクトルを提供できますが、現時点では FSR2 は精度の向上による恩恵を受けられません。モーション ベクトル バッファーの解像度は、 FfxFsr2Context
作成時にFfxFsr2ContextDescription
構造体のflags
フィールドにFFX_FSR2_ENABLE_DISPLAY_RESOLUTION_MOTION_VECTORS
フラグが設定されていない限り、レンダリング解像度と等しくなければなりません。その場合、プレゼンテーション解像度と等しくなければなりません。
FSR2 は、より多くのオブジェクトが動きベクトルを提供すると、より高品質のアップスケーリングを実行します。したがって、すべての不透明オブジェクト、アルファテスト済みオブジェクト、およびアルファブレンドオブジェクトは、すべてのカバーされたピクセルの動きベクトルを書き込むことをお勧めします。 UV のスクロールなど、頂点シェーダ エフェクトが適用されている場合、最良の結果を得るには、これらの計算もモーションの計算に考慮する必要があります。アルファ ブレンドされたオブジェクトの場合は、カバーされた各ピクセルのアルファ値をリアクティブ マスク内の対応するピクセルに保存することを強くお勧めします。これにより、FSR2 はアップスケーリング中にアルファ ブレンドされたオブジェクトをより適切に処理できるようになります。リアクティブ マスクは、パーティクルなど、モーション ベクトルの書き込みが法外な可能性があるアルファ ブレンドされたオブジェクトにとって特に重要です。
FSR2 の文脈では、「反応性」という用語は、現在のフレームに対してレンダリングされたサンプルが最終的なアップスケールされたイメージの生成に対してどの程度の影響を与えるかを意味します。通常、現在のフレームに対してレンダリングされたサンプルは、FSR2 によって計算された結果に比較的少量だけ寄与します。ただし、例外もあります。高速で移動するアルファ ブレンドされたオブジェクトに対して最良の結果を生成するために、FSR2 では、そのようなピクセルに対してより反応性が高くなるように再投影および蓄積ステージを必要とします。カラー、深度、動きベクトルのいずれからも、どのピクセルがアルファ ブレンディングを使用してレンダリングされているかを判断する良い方法はないため、FSR2 はアプリケーションがそのような領域を明示的にマークするときに最高のパフォーマンスを発揮します。
したがって、アプリケーションが FSR2 にリアクティブ マスクを提供することを強くお勧めします。リアクティブ マスクは、FSR2 が現在のピクセルを合成するときに履歴情報への依存を減らし、代わりに現在のフレームのサンプルが最終結果により多く寄与できるようにする必要があるかどうかをガイドします。リアクティブ マスクを使用すると、アプリケーションは [0.0..1.0] の値を指定できます。0.0 はピクセルがまったくリアクティブではない (デフォルトの FSR2 合成戦略を使用する必要がある) ことを示し、値 1.0 はピクセルが完全にリアクティブである必要があることを示します。反応的な。これは浮動小数点の範囲であり、さまざまな状況に合わせて調整できます。
リアクティブ マスクには他の用途もありますが、リアクティブ マスクの主な用途は、アルファ ブレンドされたオブジェクトを含む画像をアップスケーリングすることでより良い結果を生み出すことです。リアクティブ性の適切な代用は、実際にはアルファ ブレンドされたオブジェクトをシーンに合成するときに使用されるアルファ値であるため、アプリケーションはリアクティブ マスクにalpha
書き込む必要があります。リアクティブ値が 1 に近い場合、良好な結果が得られる可能性は低いことに注意してください。したがって、最大リアクティブ値を約 0.9 にクランプすることをお勧めします。
リアクティブ マスクが FSR2 に提供されていない場合 ( FfxFsr2DispatchDescription
のreactive
フィールドをNULL
に設定することによって)、クリアされたリアクティブ値を持つ内部生成された 1x1 テクスチャが使用されます。
アプリケーションがリアクティブ マスクと透明性と合成マスクを生成できるようにするために、FSR2 はオプションのヘルパー API を提供します。 API は内部で、輝度ベースのヒューリスティックを使用してピクセルごとにこれらの値を計算する計算シェーダーを起動します。
これを行うアプリケーションは、 ffxFsr2ContextGenerateReactiveMask
関数を呼び出し、2 つのバージョンのカラー バッファを渡す必要があります。1 つは不透明のみのジオメトリを含み、もう 1 つは不透明とアルファブレンドされたオブジェクトの両方を含みます。
リアクティブ マスクに加えて、FSR2 はアプリケーションがアップスケーリング プロセス中に考慮すべき他の専門家によるレンダリングの領域を示すことを可能にします。このような特殊なレンダリングの例には、レイトレースされた反射領域やアニメーション化されたテクスチャが含まれます。
リアクティブ マスクは蓄積バランスを調整しますが、透明性と合成マスクはピクセル履歴保護メカニズムを調整します。マスクは、輝度の不安定要因の影響も除去します。透明性と合成マスクの値が 0 のピクセルは、そのピクセルのロックに追加の変更を実行しません。逆に、値 1 は、そのピクセルのロックを完全に削除する必要があることを示します。
透明度および合成マスクが FSR2 に提供されていない場合 ( FfxFsr2DispatchDescription
のtransparencyAndComposition
フィールドをNULL
に設定することによって)、クリアされた透明度および合成値を持つ内部生成された 1x1 テクスチャが使用されます。
FSR2.2 には、リアクティブ マスクと透明性と合成マスクを自動的に生成する実験的な機能が含まれています。これを有効にするには、 FfxFsr2DispatchDescription
のenableAutoReactive
フィールドを「TRUE」に設定し、バックバッファの不透明のみの部分のコピーを「colorOpaqueOnly」に提供する必要があります。 FSR2 は内部でリアクティブ マスクと透明性と合成マスクを自動的に生成して使用します。マスクは、透明ジオメトリがある場合とない場合のカラー バッファーの違いを分析し、前のフレームと比較することによって、計算パスで生成されます。これらの計算の結果に基づいて、各ピクセルにリアクティブ マスクと透明性および合成マスクの値が割り当てられます。マスクの自動生成を使用するには、マスクの強度を調整および制限するための次の 4 つの値も提供する必要があります (言及されているデフォルト値は推奨される開始値ですが、タイトルごとに調整する必要があることに注意してください)。
この機能は、FSR2.2 を新しいエンジンまたはタイトルに統合するのに役立つことを目的としています。ただし、最高の品質を得るには、マテリアルに基づいてこれらの値を生成する方が、最終イメージから自動生成するよりも信頼性が高いと予想されるため、リアクティブ マスクと透明度および合成マスクを自分でレンダリングすることをお勧めします。
この機能はまだ実験段階にあり、将来的に大幅に変更される可能性があることに注意してください。
FSR2 は、アップスケーリングを実行するときに使用される露出を制御する 2 つの値を提供します。それらは次のとおりです。
露出値は、アプリケーションによって実行される後続のトーンマッピング パス中にアプリケーションが使用する露出値と一致する必要があります。これは、FSR2 が最終的なトーンマップされたイメージに表示される可能性のあるものと一貫して動作することを意味します。
このドキュメントで説明されている FSR2 アルゴリズムのさまざまな段階で、FSR2 は内部使用のために独自の露出値を計算します。 FSR2 からのすべての出力では、最終出力が書き込まれる前にこの内部トーンマッピングが反転されることに注意してください。 FSR2 は元の入力信号と同じドメインで結果を返すことを意味します。
露出値の選択が適切でないと、FSR2 のアップスケーリングの最終品質に大きな影響を与える可能性があります。したがって、特別な理由がない限り、アプリケーションではFFX_FSR2_ENABLE_AUTO_EXPOSURE
を使用することをお勧めします。 FFX_FSR2_ENABLE_AUTO_EXPOSURE
FfxFsr2ContextDescription
構造体のflags
フィールドに設定されている場合、以下の HLSL コードに示されている露出計算を使用して、ISO 100 フィルム ストックの露出応答に一致する露出値が計算されます。
float ComputeAutoExposureFromAverageLog ( float averageLogLuminance)
{
const float averageLuminance = exp (averageLogLuminance);
const float S = 100.0f ; // ISO arithmetic speed
const float K = 12.5f ;
const float exposureIso100 = log2 ((averageLuminance * S) / K);
const float q = 0.65f ;
const float luminanceMax = ( 78.0f / (q * S)) * pow ( 2.0f , exposureIso100);
return 1 / luminanceMax;
}
FSR2 の主な目的は、多数の入力に依存する時間的アップスケーリング アルゴリズムを使用して、アプリケーションのレンダリング パフォーマンスを向上させることです。したがって、パイプライン内での配置は、最高品質のビジュアル品質と優れたパフォーマンスの間の適切なバランスを確保するための鍵となります。
画像のアップスケーリングのアプローチでは、アップスケーリング アルゴリズムに関して他の画像空間アルゴリズムを配置する方法を理解することが重要です。これらの他のイメージ空間効果をアップスケーリングの前に配置すると、低解像度で実行できるという利点があり、当然のことながらアプリケーションのパフォーマンスが向上します。ただし、一部のクラスの画像空間技術には適切ではない場合があります。たとえば、多くのアプリケーションでは、おそらく物理的なカメラをシミュレートするために、最終画像にノイズや粒子が導入されることがあります。アップスケーラーの前にこれを行うと、アップスケーラーによってノイズが増幅され、結果として得られるアップスケールされたイメージに望ましくないアーティファクトが発生する可能性があります。次の表は、一般的なリアルタイム画像空間技術を 2 つの列に分けています。 「ポスト処理 A」には、通常、FSR2 のアップスケーリングの前に実行されるすべてのテクニックが含まれています。つまり、それらはすべてレンダリング解像度で実行されます。逆に、「後処理 B」列には、FSR2 の後に実行することが推奨されるすべてのテクニックが含まれています。これは、より大きなプレゼンテーション解像度で実行することを意味します。
後処理A | 後処理B |
---|---|
スクリーンスペースの反射 | フィルムグレイン |
スクリーンスペース アンビエント オクルージョン | 色収差 |
デノイザー (影、反射) | ビネット |
露出(オプション) | トーンマッピング |
咲く | |
被写界深度 | |
モーションブラー |
ここでの推奨事項はガイダンスのみを目的としており、アプリケーションの実装の正確な特性に依存することに注意してください。
適切な中間リソースの生成、シェーダー コードのコンパイル、バインディングの設定、ディスパッチの送信は可能ですが、提供されている FSR2 ホスト API を使用する方がはるかに簡単です。
API を使用するには、FSR2 ライブラリ (詳細については後ほど説明します) をリンクし、 ffx_fsr2.h
ヘッダー ファイルをインクルードする必要があります。これには、次のヘッダー依存関係があります。
ffx_assert.h
ffx_error.h
ffx_fsr2_interface.h
ffx_types.h
ffx_util.h
FSR2 API を使用するには、アプリケーション向け API のシンボルを提供するffx_fsr2_api_x64.lib
をリンクする必要があります。ただし、FSR2 の API にはモジュラー バックエンドがあり、一致するバックエンドを使用することで、さまざまなグラフィックス API やプラットフォームが対象となる可能性があります。したがって、以下の表を参照して、要件に一致するバックエンド ライブラリをさらに含める必要があります。
ターゲット | 図書館名 |
---|---|
DirectX(R)12 | ffx_fsr2_dx12_x64.lib |
バルカン(R) | ffx_fsr2_vk_x64.lib |
FSR2 API のモジュラー アーキテクチャにより、カスタム バックエンドの実装が可能になることに注意してください。詳細については、「モジュラー バックエンド」セクションを参照してください。
API の使用を開始するには、アプリケーションはまずFfxFsr2Context
構造を作成する必要があります。この構造は、バックバッファの寿命とほぼ一致する寿命を持つ場所に配置する必要があります。通常、アプリケーションのヒープ上のどこかに置くのが適切な選択です。 ffxFsr2ContextCreate
呼び出すと、 FfxFsr2Context
構造に必要なデータが設定されます。さらに、 ffxFsr2ContextCreate
から、 FfxFsr2ContextDescription
構造の一部としてFfxFsr2Context
に提供されるバックエンドへの多数の呼び出しが行われます。これらの呼び出しは、FSR2 に必要な中間リソースの作成、シェーダーとそれに関連するパイプライン状態のセットアップなどのタスクを実行します。 FSR2 API は、動的なメモリ割り当てを実行しません。
アップスケーリングが必要なアプリケーションの各フレームでは、 ffxFsr2ContextDispatch
を呼び出す必要があります。この関数は、アプリケーションの存続期間の早い段階で作成されたFfxFsr2Context
構造体と、アップスケーリングをどのように実行するか、どのデータに対して実行するかを正確に記述したものを受け入れます。この説明は、アプリケーションがFfxFsr2DispatchDescription
構造体に記入することによって提供されます。
コンテキストの破棄は、 ffxFsr2ContextDestroy
呼び出すことで実行されます。 ffxFsr2ContextDestroy
呼び出しを試みる前に GPU はアイドル状態である必要があり、この関数は FSR2 によってアクセスされているリソースが現在実行中でないことを保証するための暗黙的な同期を実行しないことに注意してください。この選択の理由は、 FfxFsr2Context
を破棄する可能性がある時点ですでに適切な同期を実行しているアプリケーションに対して、FSR2 が追加の GPU フラッシュを導入することを回避するためです。これにより、アプリケーションは、次の場合に最も効率的に FSR2 API の作成と破棄を実行できるようになります。必須。
FSR2 API の一部として提供される追加のヘルパー関数があります。これらのヘルパー関数は、サブピクセル ジッタリング オフセットの計算や、ディスパッチ解像度と FSR2 によって提供されるデフォルトのスケーリング モードに基づくレンダリング解像度の計算などのタスクを実行します。
FSR2 API の詳細なドキュメントについては、提供されている API リファレンス ドキュメントを参照してください。
FSR2 API の設計は、FSR2 アルゴリズムのコア実装がどのレンダリング API に基づいているかを認識しないことを意味します。代わりに、FSR2 はインターフェイスを通じて提供される関数を呼び出し、FSR2 でさまざまなバックエンドを使用できるようにします。この設計により、FSR2 を統合するアプリケーションが独自のバックエンド実装を提供できるようになります。つまり、FSR2 が現在サポートしていないプラットフォームが、少数の機能を実装することによってターゲットにされる可能性があります。さらに、独自のレンダリング抽象化を持つアプリケーションは独自のバックエンドを実装することもでき、メモリ管理、リソース作成、シェーダー コンパイル、シェーダー リソース バインディング、グラフィックス デバイスへの FSR2 ワークロードの送信など、FSR2 の基礎となる機能のあらゆる側面を制御できます。 。
FSR2 API は、コア API とバックエンドの間で既に説明されている分離に従って、すぐに使用できる状態で複数のライブラリにコンパイルされます。これは、FSR2 で提供されるバックエンドを使用したい場合は、コア FSR2 API ライブラリと要件に一致するバックエンドの両方をリンクする必要があることを意味します。
FSR2 のパブリック リリースには、DirectX(R) 12 および Vulkan(R) バックエンドが付属していますが、リクエストに応じて他のバックエンドも利用できます。詳細については、AMD デベロッパー テクノロジーの担当者にお問い合わせください。
FSR2 API が提供されたバックエンドのいずれか (例: DirectX(R)12 または Vulkan(R)) で使用される場合、FSR2 に必要なすべてのリソースは、ホスト アプリケーションによって提供されるグラフィックス デバイスを直接使用して、コミットされたリソースとして作成されます。ただし、バックエンド インターフェイスに存在する関数の create および destroy ファミリーをオーバーライドすることで、アプリケーションが FSR2 のメモリ管理をより正確に制御できるようになります。
これを行うには、 ffxFsr2ContextCreate
関数に渡されるFfxFsr2ContextDescription
構造体を介して完全なカスタム バックエンドを FSR2 に提供するか、目的の API のバックエンドを取得し、リソースの作成関数と破棄関数をオーバーライドして自分で処理することができます。これを行うには、 fpCreateResource
関数ポインターとfpDestroyResource
関数ポインターを上書きするだけです。
// Setup DX12 interface.
const size_t scratchBufferSize = ffxFsr2GetScratchMemorySizeDX12();
void * scratchBuffer = malloc(scratchBufferSize);
FfxErrorCode errorCode = ffxFsr2GetInterfaceDX12(&contextDescription.callbacks, m_pDevice-> GetDevice (), scratchBuffer, scratchBufferSize);
FFX_ASSERT (errorCode == FFX_OK);
// Override the resource creation and destruction.
contextDescription.callbacks.createResource = myCreateResource;
contextDescription.callbacks.destroyResource = myDestroyResource;
// Set up the context description.
contextDescription.device = ffxGetDeviceDX12(m_pDevice-> GetDevice ());
contextDescription.maxRenderSize.width = renderWidth;
contextDescription.maxRenderSize.height = renderHeight;
contextDescription.displaySize.width = displayWidth;
contextDescription.displaySize.height = displayHeight;
contextDescription.flags = FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
| FFX_FSR2_ENABLE_DEPTH_INVERTED
| FFX_FSR2_ENABLE_AUTO_EXPOSURE;
// Create the FSR2 context.
errorCode = ffxFsr2ContextCreate(&context, &contextDescription);
FFX_ASSERT (errorCode == FFX_OK);
FSR2 に必要なメモリ管理をアプリケーションが制御する興味深い利点の 1 つは、リソースのエイリアシングを実行できるため、メモリが節約できることです。メモリ要件にある表は、この手法を使用することで得られる節約量を示しています。この表に示されている節約を実現するには、FSR2 に必要なエイリアス可能なリソースと共有する適切なメモリ領域 (FSR2 ディスパッチへの呼び出し全体でその内容が存続する必要はない) を見つける必要があります。 FSR2 バックエンド インターフェイスを介して FSR2 のコア API によって行われる各FfxFsr2CreateResourceFunc
呼び出しには、 FfxCreateResourceDescription
構造の一部としてフラグのセットが含まれます。 FFX_RESOURCE_FLAGS_ALIASABLE
がflags
フィールドに設定されている場合、これは、リソースをレンダリング フレーム内の他のリソースと安全にエイリアスできることを示します。
時間的アンチエイリアス (TAA) は、前のフレームの出力を使用して、現在のフレームからより高品質の出力を構築する技術です。 FSR2 にも同様の目標があるため (レンダリング イメージの解像度を上げるという追加の目標はありますが)、アプリケーションに別の TAA パスを含める必要はなくなりました。
FSR2 はアプリケーションに依存してレンダリング中にサブピクセル ジッタリングを適用します。これは通常、カメラの投影行列に含まれます。カメラ ジッターのアプリケーションを簡単にするために、FSR2 API は、個別のジッター オフセットのシーケンス内の特定のフレームのサブピクセル ジッター オフセットを計算するユーティリティ関数の小さなセットを提供します。
int32_t ffxFsr2GetJitterPhaseCount ( int32_t renderWidth, int32_t displayWidth);
FfxErrorCode ffxFsr2GetJitterOffset ( float * outX, float * outY, int32_t jitterPhase, int32_t sequenceLength);
内部的には、これらの関数は Halton[2,3] シーケンス [Halton] を実装します。ハルトン シーケンスの目的は、利用可能なスペースをカバーする空間的に分離された点を提供することです。
ffxFsr2GetJitterOffset
から返される値は単位ピクセル空間内にあることを理解することが重要であり、これを投影行列に正しく合成するには、値を投影オフセットに変換する必要があります。上の図は、単位ピクセル空間および投影空間内の単一ピクセルを示しています。以下のコード リストは、サブピクセル ジッター オフセット値を射影行列に正しく合成する方法を示しています。
const int32_t jitterPhaseCount = ffxFsr2GetJitterPhaseCount(renderWidth, displayWidth);
float jitterX = 0 ;
float jitterY = 0 ;
ffxFsr2GetJitterOffset (&jitterX, &jitterY, index, jitterPhaseCount);
// Calculate the jittered projection matrix.
const float jitterX = 2 . 0f * jitterX / ( float )renderWidth;
const float jitterY = - 2 . 0f * jitterY / ( float )renderHeight;
const Matrix4 jitterTranslationMatrix = translateMatrix(Matrix3::identity, Vector3(jitterX, jitterY, 0 ));
const Matrix4 jitteredProjectionMatrix = jitterTranslationMatrix * projectionMatrix;
ジッターはすべてのレンダリングに適用する必要があります。これには、不透明、アルファ透明、およびレイトレースされたオブジェクトが含まれます。ラスター化されたオブジェクトの場合、 ffxFsr2GetJitterOffset
関数によって計算されたサブピクセル ジッタリング値は、頂点シェーディング中に変換を実行するために最終的に使用されるカメラ投影行列に適用できます。レイトレース レンダリングの場合、サブピクセル ジッターはレイの原点 (多くの場合カメラの位置) に適用される必要があります。
推奨されるffxFsr2GetJitterOffset
関数を使用するか独自のシーケンス ジェネレーターを使用するかに関係なく、 FfxFsr2DispatchDescription
構造体のjitterOffset
フィールドを設定して、各フレームをレンダリングするために適用されたジッター オフセットを FSR2 に通知する必要があります。さらに、推奨されるffxFsr2GetJitterOffset
関数を使用しない場合、ジッターシーケンスがヌルベクトルを生成しないように注意する必要があります。これは、xディメンションとyの両方のディメンションで0の値です。
以下の表は、デフォルトの品質モードごとのジッターシーケンス長を示しています。
品質モード | スケーリング係数 | シーケンス長 |
---|---|---|
品質 | 1.5x(次元ごと) | 18 |
バランスの取れた | 1.7x(次元ごと) | 23 |
パフォーマンス | 2.0x(次元ごと) | 32 |
ウルトラパフォーマンス | 3.0x(次元ごと) | 72 |
カスタム | [1..n] x(次元ごと) | ceil(8 * n^2) |
リアルタイムレンダリングを備えたほとんどのアプリケーションは、2つの連続したフレームの間で多数の時間的一貫性を持っています。ただし、カメラの変換の変更がレンダリングされるものに突然の変化を引き起こす可能性がある場合があります。そのような場合、FSR2は以前のフレームから蓄積したデータを再利用できる可能性は低いため、このデータをクリアして、構成プロセスでの考慮事項から除外する必要があります。 FSR2にカメラでジャンプカットが発生したことを示すために、不連続カメラ変換の最初のフレームに対してFfxFsr2DispatchDescription
構造のreset
フィールドをtrue
に設定する必要があります。
FSR2はいくつかの追加の内部リソースをクリアするため、リセットフラグを使用する場合、レンダリングパフォーマンスは一般的なフレーム間操作よりもわずかに少ない場合があります。
ネガティブMIPMAPバイアスを適用すると、通常、テクスチャの詳細が向上したアップスケール画像が生成されます。次の式をMIPMAPバイアスに適用することをお勧めします。
mipBias = log2(renderResolution/displayResolution) - 1.0 ;
アプリケーションは、一時的なエイリアシングの問題を示す可能性のある特定の高周波テクスチャコンテンツのMIPバイアスを調整することをお勧めします。
次の表は、アプリケーションがエンドユーザーに公開することを示唆する品質モードと一致するスケーリング比の上記の擬似コードを評価することに起因するMIPMAPバイアス係数を示しています。
品質モード | スケーリング係数 | MIPMAPバイアス |
---|---|---|
品質 | 1.5x(次元ごと) | -1.58 |
バランスの取れた | 1.7x(次元ごと) | -1.76 |
パフォーマンス | 2.0x(次元ごと) | -2.0 |
ウルトラパフォーマンス | 3.0x(次元ごと) | -2.58 |
FSR2 APIでは、 FfxFsr2DispatchDescription
構造を介してアプリケーションによってframeTimeDelta
提供する必要があります。この値はミリ秒単位です。60fpsで実行されている場合、渡される値は約16.6Fでなければなりません。
値は、FSR 2自動曝露機能の時間コンポーネント内で使用されます。これにより、質の高い目的で歴史の蓄積を調整できます。
高ダイナミックレンジ画像はFSR2でサポートされています。これを有効にするには、 FfxFsr2ContextDescription
構造のflags
フィールドにFFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE
ビットを設定する必要があります。画像は、線形カラー空間でFSR2に提供する必要があります。
追加のカラースペースのサポートは、FSR2の将来の改訂で提供される場合があります。
FSR2は、可能な限り最高のパフォーマンスを実現するために、半精度(FP16)ハードウェアアクセラレーションを活用するように設計されています。ただし、アプリケーションの互換性と柔軟性の最大レベルを提供するために、FSR2には、完全な精度(FP32)操作を使用してシェーダーをコンパイルする機能も含まれています。
それをサポートするすべてのハードウェアでFSR2のFP16バージョンを使用することをお勧めします。 D3D12_FEATURE_DATA_SHADER_MIN_PRECISION_SUPPORT
機能をDirectx(R)12に照会することにより、GraphicsカードのFP16のサポートレベルをクエリすることができますD3D[11/12]_SHADER_MIN_PRECISION_16_BIT
FSR2。 Vulkanの場合、 VkPhysicalDeviceFloat16Int8FeaturesKHR::shaderFloat16
が設定されていない場合、FSR2のFP32バージョンにフォールバックする必要があります。同様に、 VkPhysicalDevice16BitStorageFeatures::storageBuffer16BitAccess
が設定されていない場合、FSR2のFP32バージョンにもフォールバックする必要があります。
FSR2シェーダーソースコードでFP32パスを有効にするには、 FFX_HALF
1
に定義する必要があります。 FP16とFP32の両方の間のアルゴリズムのソースコードの大部分を共有するために(継続的なメンテナンスをサポートするために高レベルのコード共有を保証します)、FSR2シェーダーソースコードは、簡単な切り替えを容易にするタイプマクロのセットを使用していることに気付くでしょう。シェーダーソースの16ビットおよび32ビットベースタイプ。
FidelityFXタイプ | FP32 | FP16 |
---|---|---|
FFX_MIN16_F | float | min16float |
FFX_MIN16_F2 | float2 | min16float2 |
FFX_MIN16_F3 | float3 | min16float3 |
FFX_MIN16_F4 | float4 | min16float4 |
上の表には、抽象FIDERITYFX SDKタイプと、コンピレーション中のシェーダーソースの構成に応じて置換される下層の内発生型の間のマッピングが列挙されます。
最新のGPUは、波面と呼ばれるスレッドのコレクションを実行します。単一の波面を構成する正確な数のスレッドは、ハードウェア固有の数量です。 AMDのGCNやRDNAベースのGPUなどの一部のハードウェアは、64個のスレッドを収集して単一の波面に収集します。アルゴリズムの実行の正確な特性に応じて、特定の波面幅を好むことは多かれ少なかれ有利な場合があります。シェーダーモデル6.6の導入により、MicrosoftはHLSLを介して波面の幅を特定する機能を追加しました。 32と64のワイドウェーブフロント幅の両方をサポートするRDNAなどのハードウェアの場合、これは最適化のための非常に便利なツールです。これは、ドライバーソフトウェアスタックに特定の幅で波面を実行するように依頼するクリーンでポータブルな方法を提供するためです。
RDNAおよびRDNA2ベースのGPUで実行され、Microsoft Agility SDKを使用しているDirectx(R)12ベースのアプリケーションの場合、FSR2ホストAPIは64幅の波面幅を選択します。
コンテキストの説明構造には、FSR 2ランタイムから基礎となるアプリケーションにテキスト警告を渡すためのコールバック関数を提供できます。説明のfpMessage
メンバーは、さまざまなタイプの文字列メッセージを渡すための関数ポインターであるタイプFfxFsr2Message
です。この変数を適切な関数に割り当て、 FfxFsr2ContextDescription
のフラグメンバー内にFFX_FSR2_ENABLE_DEBUG_CHECKING
フラグを渡すと、機能が有効になります。これは、デバッグ開発ビルドでのみ有効になっていることをお勧めします。
チェッカーが考えられる問題を観察したときに発生する可能性のある出力の種類の例は以下にあります。
FSR2_API_DEBUG_WARNING: FFX_FSR2_ENABLE_DEPTH_INFINITE and FFX_FSR2_ENABLE_DEPTH_INVERTED present, cameraFar value is very low which may result in depth separation artefacting
FSR2_API_DEBUG_WARNING: frameTimeDelta is less than 1.0f - this value should be milliseconds (~16.6f for 60fps)
FSR2アルゴリズムは一連の段階で実装されます。これは次のとおりです。
アルゴリズムの各パス段階は、このセクションに続くセクションにレイアウトされていますが、完全なFSR2アルゴリズムのデータフローは、以下の図に示されています。
計算輝度ピラミッド段階には2つの責任があります。
次の表には、計算輝度ピラミッド段階で消費されるすべてのリソースが含まれています。
時間層は、データを供給するフレームを示します。 「現在のフレーム」とは、次に提示されるフレーム用に作成されたリソースからデータを調達する必要があることを意味します。 「以前のフレーム」は、提示されたフレーム用に作成されたリソースからデータを調達する必要があることを示しています。解像度列は、データが「レンダリングされた」解像度または「プレゼンテーション」解像度であるかどうかを示します。 「レンダリングされた」解像度は、リソースがアプリケーションがレンダリングを実行している解像度と一致する必要があることを示しています。逆に、「プレゼンテーション」は、ターゲットの解像度がユーザーに提示されるものと一致する必要があることを示します。
名前 | 時間層 | 解決 | 形式 | タイプ | 注意事項 |
---|---|---|---|---|---|
カラーバッファー | 現在のフレーム | 与える | APPLICATION SPECIFIED | テクスチャ | アプリケーションによって提供される現在のフレームのレンダリング解像度カラーバッファー。カラーバッファーの内容が高ダイナミックレンジ(HDR)にある場合、 FFX_FSR2_ENABLE_HIGH_DYNAMIC_RANGE フラグをFfxFsr2ContextDescription 構造のflags フィールドに設定する必要があります。 |
次の表には、計算輝度ピラミッド段階によって生成または変更されたすべてのリソースが含まれています。
時間層は、データを供給するフレームを示します。 「現在のフレーム」とは、次に提示されるフレーム用に作成されたリソースからデータを調達する必要があることを意味します。 「以前のフレーム」は、提示されたフレーム用に作成されたリソースからデータを調達する必要があることを示しています。解像度列は、データが「レンダリングされた」解像度または「プレゼンテーション」解像度であるかどうかを示します。 「レンダリングされた」解像度は、リソースがアプリケーションがレンダリングを実行している解像度と一致する必要があることを示しています。逆に、「プレゼンテーション」は、ターゲットの解像度がユーザーに提示されるものと一致する必要があることを示します。
名前 | 時間層 | 解決 | 形式 | タイプ | 注意事項 |
---|---|---|---|---|---|
暴露 | 現在のフレーム | 1x1 | R32_FLOAT | テクスチャ | 現在のフレームに計算された露出値を含む1x1テクスチャ。このリソースはオプションであり、 FfxFsr2ContextDescription 構造のflags フィールドにFfxFsr2Context 作成するときにFFX_FSR2_ENABLE_AUTO_EXPOSURE フラグが設定されている場合、省略できます。 |
現在の輝き | 現在のフレーム | Render * 0.5 + MipChain | R16_FLOAT | テクスチャ | 現在のフレームの輝度を含むレンダリング解像度のテクスチャの50%のテクスチャ。完全なMIPチェーンが割り当てられます。 |
計算輝度ピラミッドステージは、FidelityFXシングルパスダウンを使用して実装されています