Antialiasing.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using System;
  2. using UnityEngine;
  3. namespace UnityStandardAssets.ImageEffects
  4. {
  5. public enum AAMode
  6. {
  7. FXAA2 = 0,
  8. FXAA3Console = 1,
  9. FXAA1PresetA = 2,
  10. FXAA1PresetB = 3,
  11. NFAA = 4,
  12. SSAA = 5,
  13. DLAA = 6,
  14. }
  15. [ExecuteInEditMode]
  16. [RequireComponent(typeof (Camera))]
  17. [AddComponentMenu("Image Effects/Other/Antialiasing")]
  18. public class Antialiasing : PostEffectsBase
  19. {
  20. public AAMode mode = AAMode.FXAA3Console;
  21. public bool showGeneratedNormals = false;
  22. public float offsetScale = 0.2f;
  23. public float blurRadius = 18.0f;
  24. public float edgeThresholdMin = 0.05f;
  25. public float edgeThreshold = 0.2f;
  26. public float edgeSharpness = 4.0f;
  27. public bool dlaaSharp = false;
  28. public Shader ssaaShader;
  29. private Material ssaa;
  30. public Shader dlaaShader;
  31. private Material dlaa;
  32. public Shader nfaaShader;
  33. private Material nfaa;
  34. public Shader shaderFXAAPreset2;
  35. private Material materialFXAAPreset2;
  36. public Shader shaderFXAAPreset3;
  37. private Material materialFXAAPreset3;
  38. public Shader shaderFXAAII;
  39. private Material materialFXAAII;
  40. public Shader shaderFXAAIII;
  41. private Material materialFXAAIII;
  42. public Material CurrentAAMaterial()
  43. {
  44. Material returnValue = null;
  45. switch (mode)
  46. {
  47. case AAMode.FXAA3Console:
  48. returnValue = materialFXAAIII;
  49. break;
  50. case AAMode.FXAA2:
  51. returnValue = materialFXAAII;
  52. break;
  53. case AAMode.FXAA1PresetA:
  54. returnValue = materialFXAAPreset2;
  55. break;
  56. case AAMode.FXAA1PresetB:
  57. returnValue = materialFXAAPreset3;
  58. break;
  59. case AAMode.NFAA:
  60. returnValue = nfaa;
  61. break;
  62. case AAMode.SSAA:
  63. returnValue = ssaa;
  64. break;
  65. case AAMode.DLAA:
  66. returnValue = dlaa;
  67. break;
  68. default:
  69. returnValue = null;
  70. break;
  71. }
  72. return returnValue;
  73. }
  74. public override bool CheckResources()
  75. {
  76. CheckSupport(false);
  77. materialFXAAPreset2 = CreateMaterial(shaderFXAAPreset2, materialFXAAPreset2);
  78. materialFXAAPreset3 = CreateMaterial(shaderFXAAPreset3, materialFXAAPreset3);
  79. materialFXAAII = CreateMaterial(shaderFXAAII, materialFXAAII);
  80. materialFXAAIII = CreateMaterial(shaderFXAAIII, materialFXAAIII);
  81. nfaa = CreateMaterial(nfaaShader, nfaa);
  82. ssaa = CreateMaterial(ssaaShader, ssaa);
  83. dlaa = CreateMaterial(dlaaShader, dlaa);
  84. if (!ssaaShader.isSupported)
  85. {
  86. NotSupported();
  87. ReportAutoDisable();
  88. }
  89. return isSupported;
  90. }
  91. public void OnRenderImage(RenderTexture source, RenderTexture destination)
  92. {
  93. if (CheckResources() == false)
  94. {
  95. Graphics.Blit(source, destination);
  96. return;
  97. }
  98. // ----------------------------------------------------------------
  99. // FXAA antialiasing modes
  100. if (mode == AAMode.FXAA3Console && (materialFXAAIII != null))
  101. {
  102. materialFXAAIII.SetFloat("_EdgeThresholdMin", edgeThresholdMin);
  103. materialFXAAIII.SetFloat("_EdgeThreshold", edgeThreshold);
  104. materialFXAAIII.SetFloat("_EdgeSharpness", edgeSharpness);
  105. Graphics.Blit(source, destination, materialFXAAIII);
  106. }
  107. else if (mode == AAMode.FXAA1PresetB && (materialFXAAPreset3 != null))
  108. {
  109. Graphics.Blit(source, destination, materialFXAAPreset3);
  110. }
  111. else if (mode == AAMode.FXAA1PresetA && materialFXAAPreset2 != null)
  112. {
  113. source.anisoLevel = 4;
  114. Graphics.Blit(source, destination, materialFXAAPreset2);
  115. source.anisoLevel = 0;
  116. }
  117. else if (mode == AAMode.FXAA2 && materialFXAAII != null)
  118. {
  119. Graphics.Blit(source, destination, materialFXAAII);
  120. }
  121. else if (mode == AAMode.SSAA && ssaa != null)
  122. {
  123. // ----------------------------------------------------------------
  124. // SSAA antialiasing
  125. Graphics.Blit(source, destination, ssaa);
  126. }
  127. else if (mode == AAMode.DLAA && dlaa != null)
  128. {
  129. // ----------------------------------------------------------------
  130. // DLAA antialiasing
  131. source.anisoLevel = 0;
  132. RenderTexture interim = RenderTexture.GetTemporary(source.width, source.height);
  133. Graphics.Blit(source, interim, dlaa, 0);
  134. Graphics.Blit(interim, destination, dlaa, dlaaSharp ? 2 : 1);
  135. RenderTexture.ReleaseTemporary(interim);
  136. }
  137. else if (mode == AAMode.NFAA && nfaa != null)
  138. {
  139. // ----------------------------------------------------------------
  140. // nfaa antialiasing
  141. source.anisoLevel = 0;
  142. nfaa.SetFloat("_OffsetScale", offsetScale);
  143. nfaa.SetFloat("_BlurRadius", blurRadius);
  144. Graphics.Blit(source, destination, nfaa, showGeneratedNormals ? 1 : 0);
  145. }
  146. else
  147. {
  148. // none of the AA is supported, fallback to a simple blit
  149. Graphics.Blit(source, destination);
  150. }
  151. }
  152. }
  153. }