You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
5.8 KiB
177 lines
5.8 KiB
using System; |
|
using UnityEngine; |
|
|
|
namespace UnityStandardAssets.ImageEffects |
|
{ |
|
public enum AAMode |
|
{ |
|
FXAA2 = 0, |
|
FXAA3Console = 1, |
|
FXAA1PresetA = 2, |
|
FXAA1PresetB = 3, |
|
NFAA = 4, |
|
SSAA = 5, |
|
DLAA = 6, |
|
} |
|
|
|
[ExecuteInEditMode] |
|
[RequireComponent(typeof (Camera))] |
|
[AddComponentMenu("Image Effects/Other/Antialiasing")] |
|
public class Antialiasing : PostEffectsBase |
|
{ |
|
public AAMode mode = AAMode.FXAA3Console; |
|
|
|
public bool showGeneratedNormals = false; |
|
public float offsetScale = 0.2f; |
|
public float blurRadius = 18.0f; |
|
|
|
public float edgeThresholdMin = 0.05f; |
|
public float edgeThreshold = 0.2f; |
|
public float edgeSharpness = 4.0f; |
|
|
|
public bool dlaaSharp = false; |
|
|
|
public Shader ssaaShader; |
|
private Material ssaa; |
|
public Shader dlaaShader; |
|
private Material dlaa; |
|
public Shader nfaaShader; |
|
private Material nfaa; |
|
public Shader shaderFXAAPreset2; |
|
private Material materialFXAAPreset2; |
|
public Shader shaderFXAAPreset3; |
|
private Material materialFXAAPreset3; |
|
public Shader shaderFXAAII; |
|
private Material materialFXAAII; |
|
public Shader shaderFXAAIII; |
|
private Material materialFXAAIII; |
|
|
|
|
|
public Material CurrentAAMaterial() |
|
{ |
|
Material returnValue = null; |
|
|
|
switch (mode) |
|
{ |
|
case AAMode.FXAA3Console: |
|
returnValue = materialFXAAIII; |
|
break; |
|
case AAMode.FXAA2: |
|
returnValue = materialFXAAII; |
|
break; |
|
case AAMode.FXAA1PresetA: |
|
returnValue = materialFXAAPreset2; |
|
break; |
|
case AAMode.FXAA1PresetB: |
|
returnValue = materialFXAAPreset3; |
|
break; |
|
case AAMode.NFAA: |
|
returnValue = nfaa; |
|
break; |
|
case AAMode.SSAA: |
|
returnValue = ssaa; |
|
break; |
|
case AAMode.DLAA: |
|
returnValue = dlaa; |
|
break; |
|
default: |
|
returnValue = null; |
|
break; |
|
} |
|
|
|
return returnValue; |
|
} |
|
|
|
|
|
public override bool CheckResources() |
|
{ |
|
CheckSupport(false); |
|
|
|
materialFXAAPreset2 = CreateMaterial(shaderFXAAPreset2, materialFXAAPreset2); |
|
materialFXAAPreset3 = CreateMaterial(shaderFXAAPreset3, materialFXAAPreset3); |
|
materialFXAAII = CreateMaterial(shaderFXAAII, materialFXAAII); |
|
materialFXAAIII = CreateMaterial(shaderFXAAIII, materialFXAAIII); |
|
nfaa = CreateMaterial(nfaaShader, nfaa); |
|
ssaa = CreateMaterial(ssaaShader, ssaa); |
|
dlaa = CreateMaterial(dlaaShader, dlaa); |
|
|
|
if (!ssaaShader.isSupported) |
|
{ |
|
NotSupported(); |
|
ReportAutoDisable(); |
|
} |
|
|
|
return isSupported; |
|
} |
|
|
|
|
|
public void OnRenderImage(RenderTexture source, RenderTexture destination) |
|
{ |
|
if (CheckResources() == false) |
|
{ |
|
Graphics.Blit(source, destination); |
|
return; |
|
} |
|
|
|
// ---------------------------------------------------------------- |
|
// FXAA antialiasing modes |
|
|
|
if (mode == AAMode.FXAA3Console && (materialFXAAIII != null)) |
|
{ |
|
materialFXAAIII.SetFloat("_EdgeThresholdMin", edgeThresholdMin); |
|
materialFXAAIII.SetFloat("_EdgeThreshold", edgeThreshold); |
|
materialFXAAIII.SetFloat("_EdgeSharpness", edgeSharpness); |
|
|
|
Graphics.Blit(source, destination, materialFXAAIII); |
|
} |
|
else if (mode == AAMode.FXAA1PresetB && (materialFXAAPreset3 != null)) |
|
{ |
|
Graphics.Blit(source, destination, materialFXAAPreset3); |
|
} |
|
else if (mode == AAMode.FXAA1PresetA && materialFXAAPreset2 != null) |
|
{ |
|
source.anisoLevel = 4; |
|
Graphics.Blit(source, destination, materialFXAAPreset2); |
|
source.anisoLevel = 0; |
|
} |
|
else if (mode == AAMode.FXAA2 && materialFXAAII != null) |
|
{ |
|
Graphics.Blit(source, destination, materialFXAAII); |
|
} |
|
else if (mode == AAMode.SSAA && ssaa != null) |
|
{ |
|
// ---------------------------------------------------------------- |
|
// SSAA antialiasing |
|
Graphics.Blit(source, destination, ssaa); |
|
} |
|
else if (mode == AAMode.DLAA && dlaa != null) |
|
{ |
|
// ---------------------------------------------------------------- |
|
// DLAA antialiasing |
|
|
|
source.anisoLevel = 0; |
|
RenderTexture interim = RenderTexture.GetTemporary(source.width, source.height); |
|
Graphics.Blit(source, interim, dlaa, 0); |
|
Graphics.Blit(interim, destination, dlaa, dlaaSharp ? 2 : 1); |
|
RenderTexture.ReleaseTemporary(interim); |
|
} |
|
else if (mode == AAMode.NFAA && nfaa != null) |
|
{ |
|
// ---------------------------------------------------------------- |
|
// nfaa antialiasing |
|
|
|
source.anisoLevel = 0; |
|
|
|
nfaa.SetFloat("_OffsetScale", offsetScale); |
|
nfaa.SetFloat("_BlurRadius", blurRadius); |
|
|
|
Graphics.Blit(source, destination, nfaa, showGeneratedNormals ? 1 : 0); |
|
} |
|
else |
|
{ |
|
// none of the AA is supported, fallback to a simple blit |
|
Graphics.Blit(source, destination); |
|
} |
|
} |
|
} |
|
}
|
|
|