FiE-Game/Assets/PostProcessing/Runtime/Models/AntialiasingModel.cs
2023-07-25 00:52:50 +05:00

242 lines
7.9 KiB
C#

using System;
namespace UnityEngine.PostProcessing
{
[Serializable]
public class AntialiasingModel : PostProcessingModel
{
public enum Method
{
Fxaa,
Taa
}
// Most settings aren't exposed to the user anymore, presets are enough. Still, I'm leaving
// the tooltip attributes in case an user wants to customize each preset.
#region FXAA Settings
public enum FxaaPreset
{
ExtremePerformance,
Performance,
Default,
Quality,
ExtremeQuality
}
[Serializable]
public struct FxaaQualitySettings
{
[Tooltip("The amount of desired sub-pixel aliasing removal. Effects the sharpeness of the output.")]
[Range(0f, 1f)]
public float subpixelAliasingRemovalAmount;
[Tooltip("The minimum amount of local contrast required to qualify a region as containing an edge.")]
[Range(0.063f, 0.333f)]
public float edgeDetectionThreshold;
[Tooltip("Local contrast adaptation value to disallow the algorithm from executing on the darker regions.")]
[Range(0f, 0.0833f)]
public float minimumRequiredLuminance;
public static FxaaQualitySettings[] presets =
{
// ExtremePerformance
new FxaaQualitySettings
{
subpixelAliasingRemovalAmount = 0f,
edgeDetectionThreshold = 0.333f,
minimumRequiredLuminance = 0.0833f
},
// Performance
new FxaaQualitySettings
{
subpixelAliasingRemovalAmount = 0.25f,
edgeDetectionThreshold = 0.25f,
minimumRequiredLuminance = 0.0833f
},
// Default
new FxaaQualitySettings
{
subpixelAliasingRemovalAmount = 0.75f,
edgeDetectionThreshold = 0.166f,
minimumRequiredLuminance = 0.0833f
},
// Quality
new FxaaQualitySettings
{
subpixelAliasingRemovalAmount = 1f,
edgeDetectionThreshold = 0.125f,
minimumRequiredLuminance = 0.0625f
},
// ExtremeQuality
new FxaaQualitySettings
{
subpixelAliasingRemovalAmount = 1f,
edgeDetectionThreshold = 0.063f,
minimumRequiredLuminance = 0.0312f
}
};
}
[Serializable]
public struct FxaaConsoleSettings
{
[Tooltip("The amount of spread applied to the sampling coordinates while sampling for subpixel information.")]
[Range(0.33f, 0.5f)]
public float subpixelSpreadAmount;
[Tooltip("This value dictates how sharp the edges in the image are kept; a higher value implies sharper edges.")]
[Range(2f, 8f)]
public float edgeSharpnessAmount;
[Tooltip("The minimum amount of local contrast required to qualify a region as containing an edge.")]
[Range(0.125f, 0.25f)]
public float edgeDetectionThreshold;
[Tooltip("Local contrast adaptation value to disallow the algorithm from executing on the darker regions.")]
[Range(0.04f, 0.06f)]
public float minimumRequiredLuminance;
public static FxaaConsoleSettings[] presets =
{
// ExtremePerformance
new FxaaConsoleSettings
{
subpixelSpreadAmount = 0.33f,
edgeSharpnessAmount = 8f,
edgeDetectionThreshold = 0.25f,
minimumRequiredLuminance = 0.06f
},
// Performance
new FxaaConsoleSettings
{
subpixelSpreadAmount = 0.33f,
edgeSharpnessAmount = 8f,
edgeDetectionThreshold = 0.125f,
minimumRequiredLuminance = 0.06f
},
// Default
new FxaaConsoleSettings
{
subpixelSpreadAmount = 0.5f,
edgeSharpnessAmount = 8f,
edgeDetectionThreshold = 0.125f,
minimumRequiredLuminance = 0.05f
},
// Quality
new FxaaConsoleSettings
{
subpixelSpreadAmount = 0.5f,
edgeSharpnessAmount = 4f,
edgeDetectionThreshold = 0.125f,
minimumRequiredLuminance = 0.04f
},
// ExtremeQuality
new FxaaConsoleSettings
{
subpixelSpreadAmount = 0.5f,
edgeSharpnessAmount = 2f,
edgeDetectionThreshold = 0.125f,
minimumRequiredLuminance = 0.04f
}
};
}
[Serializable]
public struct FxaaSettings
{
public FxaaPreset preset;
public static FxaaSettings defaultSettings
{
get
{
return new FxaaSettings
{
preset = FxaaPreset.Default
};
}
}
}
#endregion
#region TAA Settings
[Serializable]
public struct TaaSettings
{
[Tooltip("The diameter (in texels) inside which jitter samples are spread. Smaller values result in crisper but more aliased output, while larger values result in more stable but blurrier output.")]
[Range(0.1f, 1f)]
public float jitterSpread;
[Tooltip("Controls the amount of sharpening applied to the color buffer.")]
[Range(0f, 3f)]
public float sharpen;
[Tooltip("The blend coefficient for a stationary fragment. Controls the percentage of history sample blended into the final color.")]
[Range(0f, 0.99f)]
public float stationaryBlending;
[Tooltip("The blend coefficient for a fragment with significant motion. Controls the percentage of history sample blended into the final color.")]
[Range(0f, 0.99f)]
public float motionBlending;
public static TaaSettings defaultSettings
{
get
{
return new TaaSettings
{
jitterSpread = 0.75f,
sharpen = 0.3f,
stationaryBlending = 0.95f,
motionBlending = 0.85f
};
}
}
}
#endregion
[Serializable]
public struct Settings
{
public Method method;
public FxaaSettings fxaaSettings;
public TaaSettings taaSettings;
public static Settings defaultSettings
{
get
{
return new Settings
{
method = Method.Fxaa,
fxaaSettings = FxaaSettings.defaultSettings,
taaSettings = TaaSettings.defaultSettings
};
}
}
}
[SerializeField]
Settings m_Settings = Settings.defaultSettings;
public Settings settings
{
get { return m_Settings; }
set { m_Settings = value; }
}
public override void Reset()
{
m_Settings = Settings.defaultSettings;
}
}
}