@ -51,13 +51,7 @@ namespace FidelityFX.FSR2
{
// Generate the data for the LUT
const int lanczos2LutWidth = 1 2 8 ;
float [ ] lanczos2Weights = new float [ lanczos2LutWidth ] ;
for ( int currentLanczosWidthIndex = 0 ; currentLanczosWidthIndex < lanczos2LutWidth ; + + currentLanczosWidthIndex )
{
float x = 2.0f * currentLanczosWidthIndex / ( lanczos2LutWidth - 1 ) ;
float y = FfxUtils . Lanczos2 ( x ) ;
lanczos2Weights [ currentLanczosWidthIndex ] = y ;
}
float [ ] lanczos2Weights = FfxUtils . GenerateLanczos2Table ( lanczos2LutWidth ) ;
float [ ] maximumBias = new float [ MaximumBiasTextureWidth * MaximumBiasTextureHeight ] ;
for ( int i = 0 ; i < maximumBias . Length ; + + i )
@ -67,24 +61,16 @@ namespace FidelityFX.FSR2
// Resource FSR2_LanczosLutData: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
// R16_SNorm textures are not supported by Unity on most platforms, strangely enough. So instead we use R32_SFloat and upload pre-normalized float data.
LanczosLut = new Texture2D ( lanczos2LutWidth , 1 , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR2_LanczosLutData" } ;
LanczosLut . SetPixelData ( lanczos2Weights , 0 ) ;
LanczosLut . Apply ( ) ;
LanczosLut = CreateLookup ( "FSR2_LanczosLutData" , new Vector2Int ( lanczos2LutWidth , 1 ) , GraphicsFormat . R32_SFloat , lanczos2Weights ) ;
// Resource FSR2_MaximumUpsampleBias: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
MaximumBiasLut = new Texture2D ( MaximumBiasTextureWidth , MaximumBiasTextureHeight , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR2_MaximumUpsampleBias" } ;
MaximumBiasLut . SetPixelData ( maximumBias , 0 ) ;
MaximumBiasLut . Apply ( ) ;
MaximumBiasLut = CreateLookup ( "FSR2_MaximumUpsampleBias" , new Vector2Int ( MaximumBiasTextureWidth , MaximumBiasTextureHeight ) , GraphicsFormat . R32_SFloat , maximumBias ) ;
// Resource FSR2_DefaultExposure: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE
DefaultExposure = new Texture2D ( 1 , 1 , GraphicsFormat . R32G32_SFloat , TextureCreationFlags . None ) { name = "FSR2_DefaultExposure" } ;
DefaultExposure . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultExposure . Apply ( ) ;
DefaultExposure = CreateLookup ( "FSR2_DefaultExposure" , GraphicsFormat . R32G32_SFloat , Color . clear ) ;
// Resource FSR2_DefaultReactivityMask: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
DefaultReactive = new Texture2D ( 1 , 1 , GraphicsFormat . R8_UNorm , TextureCreationFlags . None ) { name = "FSR2_DefaultReactivityMask" } ;
DefaultReactive . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultReactive . Apply ( ) ;
DefaultReactive = CreateLookup ( "FSR2_DefaultReactivityMask" , GraphicsFormat . R8_UNorm , Color . clear ) ;
// Resource FSR2_SpdAtomicCounter: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE
// Despite what the original FSR2 codebase says, this resource really isn't aliasable. Resetting this counter to 0 every frame breaks auto-exposure on MacOS Metal.