
AMD的FSR與NVIDIA的DLSS都是Upscaling的功能,讓遊戲能用更低的原生解析度渲染的同時仍然保留高解析度般的畫面品質,在這個realtime RT/SSGI/SSR滿街跑的時代,能夠大幅度的提升遊戲效能。
Unity內建只有支援FSR1.0與DLSS1.0,但DLSS 2跟 FSR 2.0還原出的畫面品質都遠遠超過前一代(但FRS 2.0本身的基礎效能消耗會大於FSR 1),要從頭去接這些功能需要有寫Graphics backed API像是vulkan或是DX12的能力,剛好AMD很佛心有釋出一個已經寫好,For Unity DX11的patch,於是就來試用看看,這篇就紀錄一下build所需的DLL,跟打patch到unity中的過程。
事前準備:
git clone這兩個repository
- FidelityFX-FSR2
- https://github.com/GPUOpen-Effects/FidelityFX-FSR2-Unity-URP
- Unity 2021.3f13 (URP12.1.7)
其他需要的工具
- CMake 3.16(或以上)
- 在visual studio installer中安裝 Windows 10 SDK 10.0.18362.0
- 在visual studio installer中安裝 “Desktop Development with C++”
- Visual Studio 2019
- Git
編譯FSR2 lib
- 為了要讓Unity能用FSR 2.0的library我們需要先把FSR編譯之後包成一個DLL檔,
clone好兩個所需要repo之後,先到_FSR-Unity-URP_的資料夾中找到0001-fsr-2.2-dx11-backend.patch這一個git patch檔,git patch檔其實是將兩個git commit之間的差異輸出成的檔案。
接著把這patch檔複製到FidelityFX-FSR2所在資料夾下,在terminal中輸入
- 接著到FidelityFX-FSR2資料夾/build中,會看到GenerateSolutionDX11.bat,執行這個.bat檔

執行GenerateSolutionDX11.bat之後,會多出一個DX11資料夾,進去把FSR2_Sample.sln打開(Visual Studio 2019),打開之後確認好Project→Properties→General→Platform Toolset使用的是v142版。

沒意外的話就直接build這個專案,build好之後在FidelityFX-FSR2_/bin/ffx_fsr2_api_資料夾下會看到兩個.lib檔

編譯FSR2-Unity-DLL
build好lib檔之後回到_FSR-Unity-URP__資料夾下,我們需要使用cmake來建立一個visual studio專案,這個專案會build出最終的dll。打開cmake,source code路徑就指向你的FSR-Unity-URP_的資料夾位址,戳一下左下角的Configure, cmake會把一些設定值讀取近來,

這裡name跟value對應的路徑很重要,設定錯的話等一下會build失敗,
這裡說明一下每個name對應的路徑是做啥的 :
FFX_FSR2_API_INCLUDE_DIR : 這裡要對應的是FidelityFX-FSR2_/src_資料夾路徑,裡面包含了FSR2 API需要的.h檔
FFX_FSR2_API_LIB_DIR : 這個就是我們剛build出的lib檔的位置
FSR2_UNITY_PLUGIN_DST_DIR : 產出的DLL檔的位置,看我們想設哪個資料夾都可以
UNITY_PLUGINAPI_INCLUDE_DIR : 這個路徑要指向UnityEditor的資料夾內存有像是IUnityInterface.h、IUnityGraphicsD3D11.h、IUnityLog.h這類檔案的PluginAPI資料夾,路徑是_Unity@版本/Editor/Data/PluginAPI_
- 都設定好之後,戳一下Generate按鈕,會產出fsr2-for-unity.sln這一個專案,一樣用VS2019打開後,按下Compile就行,最終會得到一個fsr2-unity-plugind.dll檔,把這檔案拉進你的unity專案內即可。

- Unity的部分 - 有了library (DLL) 我們需要修改一些URP的code才能試用FSR 2.0,修改URP的code的方式是把package改成embed的(詳細說明看這裡),不然任何對非embed的官方package的修改都會被回朔。
在package manager中安裝好URP之後,在該Unity專案的_Library\PackageCache_中找到com.unity.render-pipelines.universal@12.1.7這個資料夾,複製整個資料夾然後到專案/Package下,並且把資料夾名稱的@12.1.7這段砍掉,Unity會優先使用package資料夾下的URP,會自動忽略package cache下的那包。
接著把_FSR-Unity-URP_中的0001-Added-FSR2-support-for-URP.patch複製到目前Unity專案的跟目錄中,複製好之後用terminal cd進根目錄,輸入
這時候如果出現error,應該會發現是Packages\com.unity.render-pipelines.universal\Runtime\Passes\PostProcessPass.cs這個檔案再打patch時出問題了,trace一下會發現這個patch中的PostProcessPass.cs內容跟實際上的PostProcessPass.cs有些出入,應該是Unity有偷偷改一些code但是版本號沒動到……..或者單純AMD看錯URP版號。總而言之,只要把PostProcessPass.cs的修改的部分從git patch中拔掉(用text editor),就可以成功打patch了,打好patch之後要手動把PostProcessPass.cs實際上新增的code手動貼過去。 完成這些步驟就可以使用FSR 2.0了!

Native 4K vs FSR 2.0
左圖是4K解析度開啟SMAA,FPS大約是5X。
右圖則是使用FSR2.0

Zoom in比較一下三者差異,由左至右分別是
- 4K Render Scale設為1
- 4K,Render scale設為0.35使用linear upscaling
- 4K,Render scale設為0.35使用FSR 2.0

使用0.35的render scale來渲染4K場景,FPS提升到120左右,品質則沒有明顯的損失。 謝謝AMD,XD。