Search Unity

Unity 2021.2beta DLSS & FSR Script to switch and change between Modes and Quality

Discussion in 'Scripting' started by SJAM, Jul 5, 2021.

  1. SJAM

    SJAM

    Joined:
    Jan 11, 2009
    Posts:
    729
    Hi everyone, I'm back !

    A little gift to implement quickly FSR and/or DLSS, and change quality mode.

    First in your HDRP template do that :
    upload_2021-7-5_19-46-25.png


    Now Create 3 dropDown, like that :
    First for Modes (Native, DLSS, FSR)
    upload_2021-7-5_19-55-52.png

    FSR DropDown (UltraQuality, HighQuality, Quality, Balanced, Performance)
    I had HighQuality for better choice
    upload_2021-7-5_19-55-21.png

    DLSS DropDown (Maximum Quality, Balanced, Maximum Performance, Ultra Performance)
    upload_2021-7-5_19-56-31.png

    For best result with Raytracing, I configure the base on my script (DLSS no need AA, and FSR need TAA Low)
    upload_2021-7-5_19-58-1.png

    Finally, the script :
    Code (CSharp):
    1. using UnityEngine;
    2. using UnityEngine.Rendering;
    3. using UnityEngine.Rendering.HighDefinition;
    4.  
    5. public class DynamicResolutionManager : MonoBehaviour
    6. {
    7.     public Camera[] DynamicResolutionCamera = new Camera[0];
    8.     private DynamicResolutionType dynamicResolutionType = DynamicResolutionType.None;
    9.     public ResolutionConfiguration[] Configurations = new ResolutionConfiguration[]
    10.     {
    11.         new ResolutionConfiguration
    12.         {
    13.             name = "Native",
    14.             AntialiasingMode = HDAdditionalCameraData.AntialiasingMode.TemporalAntialiasing,
    15.             TAAQualityLevel = HDAdditionalCameraData.TAAQualityLevel.High,
    16.             DynamicResolutionScale = 1,
    17.         },
    18.         new ResolutionConfiguration
    19.         {
    20.             name = "Dlss",
    21.             dLSSQuality = DLSSQuality.MaximumQuality,
    22.             QualityMode = 2,
    23.             AntialiasingMode = HDAdditionalCameraData.AntialiasingMode.None,
    24.             DynamicResolutionScale = 1
    25.         },
    26.         new ResolutionConfiguration
    27.         {
    28.             name = "FSR",
    29.             fsrQuality = FSRQuality.UltraQuality,
    30.             AntialiasingMode = HDAdditionalCameraData.AntialiasingMode.TemporalAntialiasing,
    31.             TAAQualityLevel = HDAdditionalCameraData.TAAQualityLevel.Low,
    32.             DynamicResolutionScale = 1
    33.         }
    34.     };
    35.  
    36.     private void Start()
    37.     {
    38.         UpdateInfos();
    39.     }
    40.  
    41.     public void ChangeMode(int enumVal)
    42.     {
    43.         dynamicResolutionType = (DynamicResolutionType)enumVal;
    44.  
    45.         switch (dynamicResolutionType)
    46.         {
    47.             case DynamicResolutionType.None:
    48.                 SwitchToDLSSAndNativeMode();
    49.                 break;
    50.             case DynamicResolutionType.DLSS:
    51.                 SwitchToDLSSAndNativeMode();
    52.                 break;
    53.             case DynamicResolutionType.FSR:
    54.                 SwitchToFSRMode();
    55.                 break;
    56.         }
    57.     }
    58.  
    59.     void SwitchToDLSSAndNativeMode()
    60.     {
    61.         ApplyResolution();
    62.         ApplySettingsToCam();
    63.     }
    64.     void SwitchToFSRMode()
    65.     {
    66.         ApplySettingsToCam();
    67.         Configurations[(int)dynamicResolutionType].DynamicResolutionScale = GetFSRDynamicScale(Configurations[(int)dynamicResolutionType].fsrQuality);
    68.         ApplyResolution();
    69.     }
    70.  
    71.     void ApplySettingsToCam()
    72.     {
    73.         if (DynamicResolutionCamera.Length == 0 || DynamicResolutionCamera[0] == null)
    74.             return;
    75.  
    76.         ResolutionConfiguration mode = Configurations[(int)dynamicResolutionType];
    77.  
    78.         foreach (Camera cam in DynamicResolutionCamera)
    79.         {
    80.             if(cam != null)
    81.             {
    82.                 HDAdditionalCameraData HDCam = cam.gameObject.GetComponent<HDAdditionalCameraData>();
    83.                 HDCam.antialiasing = mode.AntialiasingMode;
    84.                 HDCam.TAAQuality = mode.TAAQualityLevel;
    85.  
    86.                 switch (dynamicResolutionType)
    87.                 {
    88.                     case DynamicResolutionType.None:
    89.                         HDCam.allowDeepLearningSuperSampling = false;
    90.                         HDCam.allowDynamicResolution = false;
    91.                         break;
    92.                     case DynamicResolutionType.DLSS:
    93.                         HDCam.allowDynamicResolution = true;
    94.                         HDCam.allowDeepLearningSuperSampling = true;
    95.                         HDCam.deepLearningSuperSamplingUseCustomQualitySettings = true;
    96.                         HDCam.deepLearningSuperSamplingQuality = mode.QualityMode;
    97.                         break;
    98.                     case DynamicResolutionType.FSR:
    99.                         HDCam.allowDynamicResolution = true;
    100.                         HDCam.allowDeepLearningSuperSampling = false;
    101.                         break;
    102.                 }
    103.             }
    104.         }
    105.     }
    106.     public void ChangeDLSSQuality(int enumQualityVal)
    107.     {
    108.         DLSSQuality dLSSQuality = (DLSSQuality)enumQualityVal;
    109.         uint QVal = 2;
    110.         switch (dLSSQuality)
    111.         {
    112.             case DLSSQuality.MaximumPerformance:
    113.                 QVal = 0;
    114.                 break;
    115.             case DLSSQuality.Balanced:
    116.                 QVal = 1;
    117.                 break;
    118.             case DLSSQuality.MaximumQuality:
    119.                 QVal = 2;
    120.                 break;
    121.             case DLSSQuality.UltraPerformance:
    122.                 QVal = 3;
    123.                 break;
    124.         }
    125.         Configurations[(int)dynamicResolutionType].QualityMode = QVal;
    126.         ApplySettingsToCam();
    127.     }
    128.  
    129.     public void ChangeFSRQuality(int enumQualityVal)
    130.     {
    131.         FSRQuality Q = (FSRQuality)enumQualityVal;
    132.         Configurations[(int)dynamicResolutionType].fsrQuality = Q;
    133.         Configurations[(int)dynamicResolutionType].DynamicResolutionScale = GetFSRDynamicScale(Q);
    134.         ApplyResolution();
    135.         UpdateInfos();//To Remove
    136.     }
    137.  
    138.     float GetFSRDynamicScale(FSRQuality quality)
    139.     {
    140.         float newScale = 1;
    141.  
    142.         switch (quality)
    143.         {
    144.             case FSRQuality.UltraQuality:
    145.                 newScale = .76953125F;
    146.                 break;
    147.             case FSRQuality.HighQuality:
    148.                 newScale = .73F;
    149.                 break;
    150.             case FSRQuality.Quality:
    151.                 newScale = .66640625F;
    152.                 break;
    153.             case FSRQuality.Balanced:
    154.                 newScale = .58828125F;
    155.                 break;
    156.             case FSRQuality.Performance:
    157.                 newScale = .5f;
    158.                 break;
    159.         }
    160.         return newScale;
    161.     }
    162.  
    163.     void ApplyResolution()
    164.     {
    165.         DynamicResolutionHandler.SetDynamicResScaler(SetDynamicResolutionScale, DynamicResScalePolicyType.ReturnsMinMaxLerpFactor);
    166.     }
    167.  
    168.     float SetDynamicResolutionScale()
    169.     {
    170.         return Configurations[(int)dynamicResolutionType].DynamicResolutionScale;
    171.     }
    172.  
    173.     //Debug Change Quality Mode
    174.     void UpdateInfos()
    175.     {
    176.         float m_Scale = Configurations[(int)dynamicResolutionType].DynamicResolutionScale;
    177.         int rezWidth = Mathf.RoundToInt(m_Scale * Screen.currentResolution.width);
    178.         int rezHeight = Mathf.RoundToInt(m_Scale * Screen.currentResolution.height);
    179.         Debug.Log(string.Format("Scale: {0:F3}x{1:F3}\nResolution: {2}x{3}\n",
    180.             m_Scale,
    181.             m_Scale,
    182.             rezWidth,
    183.             rezHeight));
    184.     }
    185. }
    186.  
    187. public class ResolutionConfiguration
    188. {
    189.     public string name;
    190.     public DLSSQuality dLSSQuality;
    191.     public uint QualityMode;
    192.     public FSRQuality fsrQuality;
    193.     public float DynamicResolutionScale;
    194.     public HDAdditionalCameraData.AntialiasingMode AntialiasingMode;
    195.     public HDAdditionalCameraData.TAAQualityLevel TAAQualityLevel;
    196. }
    197.  
    198. public enum DynamicResolutionType
    199. {
    200.     None,
    201.     DLSS,
    202.     FSR
    203. }
    204.  
    205. public enum DLSSQuality
    206. {
    207.     MaximumQuality,
    208.     Balanced,
    209.     MaximumPerformance,
    210.     UltraPerformance
    211. }
    212. public enum FSRQuality
    213. {
    214.     UltraQuality,
    215.     HighQuality,
    216.     Quality,
    217.     Balanced,
    218.     Performance
    219. }
    Enjoy !
     
    Last edited: Jul 5, 2021
    CleverAI, Artanic, jnbbender and 5 others like this.
  2. gorbit99

    gorbit99

    Joined:
    Jul 14, 2015
    Posts:
    1,350
    I love you, this is the exact problem I've tried to solve an hour ago.
     
  3. SJAM

    SJAM

    Joined:
    Jan 11, 2009
    Posts:
    729
    Your welcome ;)
     
  4. Qleenie

    Qleenie

    Joined:
    Jan 27, 2019
    Posts:
    871
    Wow, this is great stuff. However, seems that with current version, one must set "Use Optimal Settings" for DLSS to kick in. Seems that it does not render at lower resolution without this setting.
     
  5. A12Acorns

    A12Acorns

    Joined:
    Jan 31, 2022
    Posts:
    5
    Thank you, thought the way I did it worked but either way this seems much better. Will make sure to give credit. Thank you.