UnityMol  0.9.6-875
UnityMol viewer / In developement
Blur.cs
Go to the documentation of this file.
1 using System;
2 using UnityEngine;
3 
4 namespace UnityStandardAssets.ImageEffects
5 {
6  [ExecuteInEditMode]
7  [AddComponentMenu("Image Effects/Blur/Blur")]
8  public class Blur : MonoBehaviour
9  {
11  [Range(0,10)]
12  public int iterations = 3;
13 
17  [Range(0.0f,1.0f)]
18  public float blurSpread = 0.6f;
19 
20 
21  // --------------------------------------------------------
22  // The blur iteration shader.
23  // Basically it just takes 4 texture samples and averages them.
24  // By applying it repeatedly and spreading out sample locations
25  // we get a Gaussian blur approximation.
26 
27  public Shader blurShader = null;
28 
29  static Material m_Material = null;
30  protected Material material {
31  get {
32  if (m_Material == null) {
33  m_Material = new Material(blurShader);
34  m_Material.hideFlags = HideFlags.DontSave;
35  }
36  return m_Material;
37  }
38  }
39 
40  protected void OnDisable() {
41  if ( m_Material ) {
42  DestroyImmediate( m_Material );
43  }
44  }
45 
46  // --------------------------------------------------------
47 
48  protected void Start()
49  {
50  // Disable if we don't support image effects
51  if (!SystemInfo.supportsImageEffects) {
52  enabled = false;
53  return;
54  }
55  // Disable if the shader can't run on the users graphics card
56  if (!blurShader || !material.shader.isSupported) {
57  enabled = false;
58  return;
59  }
60  }
61 
62  // Performs one blur iteration.
63  public void FourTapCone (RenderTexture source, RenderTexture dest, int iteration)
64  {
65  float off = 0.5f + iteration*blurSpread;
66  Graphics.BlitMultiTap (source, dest, material,
67  new Vector2(-off, -off),
68  new Vector2(-off, off),
69  new Vector2( off, off),
70  new Vector2( off, -off)
71  );
72  }
73 
74  // Downsamples the texture to a quarter resolution.
75  private void DownSample4x (RenderTexture source, RenderTexture dest)
76  {
77  float off = 1.0f;
78  Graphics.BlitMultiTap (source, dest, material,
79  new Vector2(-off, -off),
80  new Vector2(-off, off),
81  new Vector2( off, off),
82  new Vector2( off, -off)
83  );
84  }
85 
86  // Called by the camera to apply the image effect
87  void OnRenderImage (RenderTexture source, RenderTexture destination) {
88  int rtW = source.width/4;
89  int rtH = source.height/4;
90  RenderTexture buffer = RenderTexture.GetTemporary(rtW, rtH, 0);
91 
92  // Copy source to the 4x4 smaller texture.
93  DownSample4x (source, buffer);
94 
95  // Blur the small texture
96  for(int i = 0; i < iterations; i++)
97  {
98  RenderTexture buffer2 = RenderTexture.GetTemporary(rtW, rtH, 0);
99  FourTapCone (buffer, buffer2, i);
100  RenderTexture.ReleaseTemporary(buffer);
101  buffer = buffer2;
102  }
103  Graphics.Blit(buffer, destination);
104 
105  RenderTexture.ReleaseTemporary(buffer);
106  }
107  }
108 }
void FourTapCone(RenderTexture source, RenderTexture dest, int iteration)
Definition: Blur.cs:63
void OnRenderImage(RenderTexture source, RenderTexture destination)
Definition: Blur.cs:87
void DownSample4x(RenderTexture source, RenderTexture dest)
Definition: Blur.cs:75