Rasagar/Library/PackageCache/com.unity.postprocessing/PostProcessing/Runtime/Effects/SubpixelMorphologicalAntialiasing.cs
2024-09-27 20:27:46 +03:00

85 lines
3.5 KiB
C#

using System;
namespace UnityEngine.Rendering.PostProcessing
{
/// <summary>
/// This class holds settings for the Subpixel Morphological Anti-aliasing (SMAA) effect.
/// </summary>
[UnityEngine.Scripting.Preserve]
[Serializable]
public sealed class SubpixelMorphologicalAntialiasing
{
enum Pass
{
EdgeDetection = 0,
BlendWeights = 3,
NeighborhoodBlending = 6
}
/// <summary>
/// Quality presets.
/// </summary>
public enum Quality
{
/// <summary>
/// Low quality.
/// </summary>
Low = 0,
/// <summary>
/// Medium quality.
/// </summary>
Medium = 1,
/// <summary>
/// High quality.
/// </summary>
High = 2
}
/// <summary>
/// The quality preset to use for the anti-aliasing filter.
/// </summary>
[Tooltip("Lower quality is faster at the expense of visual quality (Low = ~60%, Medium = ~80%).")]
public Quality quality = Quality.High;
/// <summary>
/// Checks if the effect is supported on the target platform.
/// </summary>
/// <returns><c>true</c> if the anti-aliasing filter is supported, <c>false</c> otherwise</returns>
public bool IsSupported()
{
return !RuntimeUtilities.isSinglePassStereoEnabled;
}
internal void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(context.resources.shaders.subpixelMorphologicalAntialiasing);
sheet.properties.SetTexture("_AreaTex", context.resources.smaaLuts.area);
sheet.properties.SetTexture("_SearchTex", context.resources.smaaLuts.search);
var cmd = context.command;
cmd.BeginSample("SubpixelMorphologicalAntialiasing");
#if UNITY_2017_3_OR_NEWER
bool dynamicResolutionEnabled = RuntimeUtilities.IsDynamicResolutionEnabled(context.camera);
cmd.GetTemporaryRT(ShaderIDs.SMAA_Flip, context.width, context.height, 0, FilterMode.Bilinear, context.sourceFormat, RenderTextureReadWrite.Linear, 1, false, RenderTextureMemoryless.None, dynamicResolutionEnabled);
cmd.GetTemporaryRT(ShaderIDs.SMAA_Flop, context.width, context.height, 0, FilterMode.Bilinear, context.sourceFormat, RenderTextureReadWrite.Linear, 1, false, RenderTextureMemoryless.None, dynamicResolutionEnabled);
#else
cmd.GetTemporaryRT(ShaderIDs.SMAA_Flip, context.width, context.height, 0, FilterMode.Bilinear, context.sourceFormat, RenderTextureReadWrite.Linear, 1, false);
cmd.GetTemporaryRT(ShaderIDs.SMAA_Flop, context.width, context.height, 0, FilterMode.Bilinear, context.sourceFormat, RenderTextureReadWrite.Linear, 1, false);
#endif
cmd.BlitFullscreenTriangle(context.source, ShaderIDs.SMAA_Flip, sheet, (int)Pass.EdgeDetection + (int)quality, true);
cmd.BlitFullscreenTriangle(ShaderIDs.SMAA_Flip, ShaderIDs.SMAA_Flop, sheet, (int)Pass.BlendWeights + (int)quality);
cmd.SetGlobalTexture("_BlendTex", ShaderIDs.SMAA_Flop);
cmd.BlitFullscreenTriangle(context.source, context.destination, sheet, (int)Pass.NeighborhoodBlending);
cmd.ReleaseTemporaryRT(ShaderIDs.SMAA_Flip);
cmd.ReleaseTemporaryRT(ShaderIDs.SMAA_Flop);
cmd.EndSample("SubpixelMorphologicalAntialiasing");
}
}
}