BlurOptimized.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System;
  2. using UnityEngine;
  3. namespace UnityStandardAssets.ImageEffects
  4. {
  5. [ExecuteInEditMode]
  6. [RequireComponent (typeof(Camera))]
  7. [AddComponentMenu ("Image Effects/Blur/Blur (Optimized)")]
  8. public class BlurOptimized : PostEffectsBase
  9. {
  10. [Range(0, 2)]
  11. public int downsample = 1;
  12. public enum BlurType {
  13. StandardGauss = 0,
  14. SgxGauss = 1,
  15. }
  16. [Range(0.0f, 10.0f)]
  17. public float blurSize = 3.0f;
  18. [Range(1, 4)]
  19. public int blurIterations = 2;
  20. public BlurType blurType= BlurType.StandardGauss;
  21. public Shader blurShader = null;
  22. private Material blurMaterial = null;
  23. public override bool CheckResources () {
  24. CheckSupport (false);
  25. blurMaterial = CheckShaderAndCreateMaterial (blurShader, blurMaterial);
  26. if (!isSupported)
  27. ReportAutoDisable ();
  28. return isSupported;
  29. }
  30. public void OnDisable () {
  31. if (blurMaterial)
  32. DestroyImmediate (blurMaterial);
  33. }
  34. public void OnRenderImage (RenderTexture source, RenderTexture destination) {
  35. if (CheckResources() == false) {
  36. Graphics.Blit (source, destination);
  37. return;
  38. }
  39. float widthMod = 1.0f / (1.0f * (1<<downsample));
  40. blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod, -blurSize * widthMod, 0.0f, 0.0f));
  41. source.filterMode = FilterMode.Bilinear;
  42. int rtW = source.width >> downsample;
  43. int rtH = source.height >> downsample;
  44. // downsample
  45. RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  46. rt.filterMode = FilterMode.Bilinear;
  47. Graphics.Blit (source, rt, blurMaterial, 0);
  48. var passOffs= blurType == BlurType.StandardGauss ? 0 : 2;
  49. for(int i = 0; i < blurIterations; i++) {
  50. float iterationOffs = (i*1.0f);
  51. blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod + iterationOffs, -blurSize * widthMod - iterationOffs, 0.0f, 0.0f));
  52. // vertical blur
  53. RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  54. rt2.filterMode = FilterMode.Bilinear;
  55. Graphics.Blit (rt, rt2, blurMaterial, 1 + passOffs);
  56. RenderTexture.ReleaseTemporary (rt);
  57. rt = rt2;
  58. // horizontal blur
  59. rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
  60. rt2.filterMode = FilterMode.Bilinear;
  61. Graphics.Blit (rt, rt2, blurMaterial, 2 + passOffs);
  62. RenderTexture.ReleaseTemporary (rt);
  63. rt = rt2;
  64. }
  65. Graphics.Blit (rt, destination);
  66. RenderTexture.ReleaseTemporary (rt);
  67. }
  68. }
  69. }