VignetteAndChromaticAberration.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using UnityEngine;
  3. namespace UnityStandardAssets.ImageEffects
  4. {
  5. [ExecuteInEditMode]
  6. [RequireComponent (typeof(Camera))]
  7. [AddComponentMenu ("Image Effects/Camera/Vignette and Chromatic Aberration")]
  8. public class VignetteAndChromaticAberration : PostEffectsBase
  9. {
  10. public enum AberrationMode
  11. {
  12. Simple = 0,
  13. Advanced = 1,
  14. }
  15. public AberrationMode mode = AberrationMode.Simple;
  16. public float intensity = 0.036f; // intensity == 0 disables pre pass (optimization)
  17. public float chromaticAberration = 0.2f;
  18. public float axialAberration = 0.5f;
  19. public float blur = 0.0f; // blur == 0 disables blur pass (optimization)
  20. public float blurSpread = 0.75f;
  21. public float luminanceDependency = 0.25f;
  22. public float blurDistance = 2.5f;
  23. public Shader vignetteShader;
  24. public Shader separableBlurShader;
  25. public Shader chromAberrationShader;
  26. private Material m_VignetteMaterial;
  27. private Material m_SeparableBlurMaterial;
  28. private Material m_ChromAberrationMaterial;
  29. public override bool CheckResources ()
  30. {
  31. CheckSupport (false);
  32. m_VignetteMaterial = CheckShaderAndCreateMaterial (vignetteShader, m_VignetteMaterial);
  33. m_SeparableBlurMaterial = CheckShaderAndCreateMaterial (separableBlurShader, m_SeparableBlurMaterial);
  34. m_ChromAberrationMaterial = CheckShaderAndCreateMaterial (chromAberrationShader, m_ChromAberrationMaterial);
  35. if (!isSupported)
  36. ReportAutoDisable ();
  37. return isSupported;
  38. }
  39. void OnRenderImage (RenderTexture source, RenderTexture destination)
  40. {
  41. if ( CheckResources () == false)
  42. {
  43. Graphics.Blit (source, destination);
  44. return;
  45. }
  46. int rtW = source.width;
  47. int rtH = source.height;
  48. bool doPrepass = (Mathf.Abs(blur)>0.0f || Mathf.Abs(intensity)>0.0f);
  49. float widthOverHeight = (1.0f * rtW) / (1.0f * rtH);
  50. const float oneOverBaseSize = 1.0f / 512.0f;
  51. RenderTexture color = null;
  52. RenderTexture color2A = null;
  53. if (doPrepass)
  54. {
  55. color = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  56. // Blur corners
  57. if (Mathf.Abs (blur)>0.0f)
  58. {
  59. color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);
  60. Graphics.Blit (source, color2A, m_ChromAberrationMaterial, 0);
  61. for(int i = 0; i < 2; i++)
  62. { // maybe make iteration count tweakable
  63. m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (0.0f, blurSpread * oneOverBaseSize, 0.0f, 0.0f));
  64. RenderTexture color2B = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);
  65. Graphics.Blit (color2A, color2B, m_SeparableBlurMaterial);
  66. RenderTexture.ReleaseTemporary (color2A);
  67. m_SeparableBlurMaterial.SetVector ("offsets",new Vector4 (blurSpread * oneOverBaseSize / widthOverHeight, 0.0f, 0.0f, 0.0f));
  68. color2A = RenderTexture.GetTemporary (rtW / 2, rtH / 2, 0, source.format);
  69. Graphics.Blit (color2B, color2A, m_SeparableBlurMaterial);
  70. RenderTexture.ReleaseTemporary (color2B);
  71. }
  72. }
  73. m_VignetteMaterial.SetFloat("_Intensity", (1.0f / (1.0f - intensity) - 1.0f)); // intensity for vignette
  74. m_VignetteMaterial.SetFloat("_Blur", (1.0f / (1.0f - blur)) - 1.0f); // blur intensity
  75. m_VignetteMaterial.SetTexture ("_VignetteTex", color2A); // blurred texture
  76. Graphics.Blit (source, color, m_VignetteMaterial, 0); // prepass blit: darken & blur corners
  77. }
  78. m_ChromAberrationMaterial.SetFloat ("_ChromaticAberration", chromaticAberration);
  79. m_ChromAberrationMaterial.SetFloat ("_AxialAberration", axialAberration);
  80. m_ChromAberrationMaterial.SetVector ("_BlurDistance", new Vector2 (-blurDistance, blurDistance));
  81. m_ChromAberrationMaterial.SetFloat ("_Luminance", 1.0f/Mathf.Max(Mathf.Epsilon, luminanceDependency));
  82. if (doPrepass) color.wrapMode = TextureWrapMode.Clamp;
  83. else source.wrapMode = TextureWrapMode.Clamp;
  84. Graphics.Blit (doPrepass ? color : source, destination, m_ChromAberrationMaterial, mode == AberrationMode.Advanced ? 2 : 1);
  85. RenderTexture.ReleaseTemporary (color);
  86. RenderTexture.ReleaseTemporary (color2A);
  87. }
  88. }
  89. }