BlurOptimized.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using UnityEngine;
  3. /**
  4. * 在 UnityStandardAssets 的模糊效果上做了魔改
  5. * 1. BlurType 只保留标准高斯
  6. * 2. 修改 MobileBlur.shader 增加圆形裁剪
  7. */
  8. namespace UnityStandardAssets.ImageEffects
  9. {
  10. [ExecuteInEditMode]
  11. [RequireComponent (typeof(Camera))]
  12. [AddComponentMenu ("Image Effects/Blur/Blur (Optimized)")]
  13. public class BlurOptimized : PostEffectsBase
  14. {
  15. [Range(0, 2)]
  16. public int downsample = 1;
  17. public enum BlurType {
  18. StandardGauss = 0,
  19. SgxGauss = 1,
  20. }
  21. [Range(0.0f, 10.0f)]
  22. public float blurSize = 3.0f;
  23. [Range(1, 4)]
  24. public int blurIterations = 2;
  25. public float darken = 0;
  26. public Vector3 clipCircle = new Vector3(0.5f, 0.5f, 0.2f);
  27. private BlurType blurType = BlurType.StandardGauss;
  28. public Shader blurShader = null;
  29. private Material blurMaterial = null;
  30. public override bool CheckResources () {
  31. CheckSupport (false);
  32. blurMaterial = CheckShaderAndCreateMaterial (blurShader, blurMaterial);
  33. if (!isSupported)
  34. ReportAutoDisable ();
  35. return isSupported;
  36. }
  37. public void OnDisable () {
  38. if (blurMaterial)
  39. DestroyImmediate (blurMaterial);
  40. }
  41. public void OnRenderImage (RenderTexture source, RenderTexture destination) {
  42. if (CheckResources() == false) {
  43. Graphics.Blit (source, destination);
  44. return;
  45. }
  46. float widthMod = 1.0f / (1.0f * (1<<downsample));
  47. blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod, -blurSize * widthMod, 0.0f, 0.0f));
  48. source.filterMode = FilterMode.Bilinear;
  49. int rtW = source.width >> downsample;
  50. int rtH = source.height >> downsample;
  51. // downsample
  52. RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  53. rt.filterMode = FilterMode.Bilinear;
  54. Graphics.Blit (source, rt, blurMaterial, 0);
  55. var passOffs= blurType == BlurType.StandardGauss ? 0 : 2;
  56. for(int i = 0; i < blurIterations; i++) {
  57. float iterationOffs = (i*1.0f);
  58. blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod + iterationOffs, -blurSize * widthMod - iterationOffs, 0.0f, 0.0f));
  59. // vertical blur
  60. RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  61. rt2.filterMode = FilterMode.Bilinear;
  62. Graphics.Blit (rt, rt2, blurMaterial, 1 + passOffs);
  63. RenderTexture.ReleaseTemporary (rt);
  64. rt = rt2;
  65. // horizontal blur
  66. rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  67. rt2.filterMode = FilterMode.Bilinear;
  68. Graphics.Blit (rt, rt2, blurMaterial, 2 + passOffs);
  69. RenderTexture.ReleaseTemporary (rt);
  70. rt = rt2;
  71. }
  72. // compose
  73. blurMaterial.SetVector("_Clip", clipCircle);
  74. blurMaterial.SetFloat("_Darken", darken);
  75. blurMaterial.SetTexture("_SourceTex", source);
  76. Graphics.Blit (rt, destination, blurMaterial, 5);
  77. RenderTexture.ReleaseTemporary (rt);
  78. }
  79. }
  80. }