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     {

10         ///
Blur iterations - larger number means more blur.
11         
[Range(0,10)]
12         
public int iterations = 3;
13
14         ///
Blur spread for each iteration. Lower values
15         ///
give better looking blur, but require more iterations to
16         ///
get large blurs. Value is usually between 0.5 and 1.0.
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 }


Gõ tìm kiếm nhanh...