1 using System;
2 using
UnityEngine;
3
4 namespace
UnityStandardAssets.ImageEffects
5 {
6     
public enum AAMode
7     {
8         FXAA2 =
0,
9         FXAA3Console =
1,
10         FXAA1PresetA =
2,
11         FXAA1PresetB =
3,
12         NFAA =
4,
13         SSAA =
5,
14         DLAA =
6,
15     }
16
17     
[ExecuteInEditMode]
18     
[RequireComponent(typeof (Camera))]
19     
[AddComponentMenu("Image Effects/Other/Antialiasing")]
20     
public class Antialiasing : PostEffectsBase
21     {
22         
public AAMode mode = AAMode.FXAA3Console;
23
24         
public bool showGeneratedNormals = false;
25         
public float offsetScale = 0.2f;
26         
public float blurRadius = 18.0f;
27
28         
public float edgeThresholdMin = 0.05f;
29         
public float edgeThreshold = 0.2f;
30         
public float edgeSharpness = 4.0f;
31
32         
public bool dlaaSharp = false;
33
34         
public Shader ssaaShader;
35         
private Material ssaa;
36         
public Shader dlaaShader;
37         
private Material dlaa;
38         
public Shader nfaaShader;
39         
private Material nfaa;
40         
public Shader shaderFXAAPreset2;
41         
private Material materialFXAAPreset2;
42         
public Shader shaderFXAAPreset3;
43         
private Material materialFXAAPreset3;
44         
public Shader shaderFXAAII;
45         
private Material materialFXAAII;
46         
public Shader shaderFXAAIII;
47         
private Material materialFXAAIII;
48
49
50         
public Material CurrentAAMaterial()
51         {
52             Material returnValue =
null;
53
54             
switch (mode)
55             {
56                 
case AAMode.FXAA3Console:
57                     returnValue = materialFXAAIII;
58                     
break;
59                 
case AAMode.FXAA2:
60                     returnValue = materialFXAAII;
61                     
break;
62                 
case AAMode.FXAA1PresetA:
63                     returnValue = materialFXAAPreset2;
64                     
break;
65                 
case AAMode.FXAA1PresetB:
66                     returnValue = materialFXAAPreset3;
67                     
break;
68                 
case AAMode.NFAA:
69                     returnValue = nfaa;
70                     
break;
71                 
case AAMode.SSAA:
72                     returnValue = ssaa;
73                     
break;
74                 
case AAMode.DLAA:
75                     returnValue = dlaa;
76                     
break;
77                 
default:
78                     returnValue =
null;
79                     
break;
80             }
81
82             
return returnValue;
83         }
84
85
86         
public override bool CheckResources()
87         {
88             CheckSupport(
false);
89
90             materialFXAAPreset2 = CreateMaterial(shaderFXAAPreset2, materialFXAAPreset2);
91             materialFXAAPreset3 = CreateMaterial(shaderFXAAPreset3, materialFXAAPreset3);
92             materialFXAAII = CreateMaterial(shaderFXAAII, materialFXAAII);
93             materialFXAAIII = CreateMaterial(shaderFXAAIII, materialFXAAIII);
94             nfaa = CreateMaterial(nfaaShader, nfaa);
95             ssaa = CreateMaterial(ssaaShader, ssaa);
96             dlaa = CreateMaterial(dlaaShader, dlaa);
97
98             
if (!ssaaShader.isSupported)
99             {
100                 NotSupported();
101                 ReportAutoDisable();
102             }
103
104             
return isSupported;
105         }
106
107
108         
public void OnRenderImage(RenderTexture source, RenderTexture destination)
109         {
110             
if (CheckResources() == false)
111             {
112                 Graphics.Blit(source, destination);
113                 
return;
114             }
115
116             
// ----------------------------------------------------------------
117             
// FXAA antialiasing modes
118
119             
if (mode == AAMode.FXAA3Console && (materialFXAAIII != null))
120             {
121                 materialFXAAIII.SetFloat(
"_EdgeThresholdMin", edgeThresholdMin);
122                 materialFXAAIII.SetFloat(
"_EdgeThreshold", edgeThreshold);
123                 materialFXAAIII.SetFloat(
"_EdgeSharpness", edgeSharpness);
124
125                 Graphics.Blit(source, destination, materialFXAAIII);
126             }
127             
else if (mode == AAMode.FXAA1PresetB && (materialFXAAPreset3 != null))
128             {
129                 Graphics.Blit(source, destination, materialFXAAPreset3);
130             }
131             
else if (mode == AAMode.FXAA1PresetA && materialFXAAPreset2 != null)
132             {
133                 source.anisoLevel =
4;
134                 Graphics.Blit(source, destination, materialFXAAPreset2);
135                 source.anisoLevel =
0;
136             }
137             
else if (mode == AAMode.FXAA2 && materialFXAAII != null)
138             {
139                 Graphics.Blit(source, destination, materialFXAAII);
140             }
141             
else if (mode == AAMode.SSAA && ssaa != null)
142             {
143                 
// ----------------------------------------------------------------
144                 
// SSAA antialiasing
145                 Graphics.Blit(source, destination, ssaa);
146             }
147             
else if (mode == AAMode.DLAA && dlaa != null)
148             {
149                 
// ----------------------------------------------------------------
150                 
// DLAA antialiasing
151
152                 source.anisoLevel =
0;
153                 RenderTexture interim = RenderTexture.GetTemporary(source.width, source.height);
154                 Graphics.Blit(source, interim, dlaa,
0);
155                 Graphics.Blit(interim, destination, dlaa, dlaaSharp ?
2 : 1);
156                 RenderTexture.ReleaseTemporary(interim);
157             }
158             
else if (mode == AAMode.NFAA && nfaa != null)
159             {
160                 
// ----------------------------------------------------------------
161                 
// nfaa antialiasing
162
163                 source.anisoLevel =
0;
164
165                 nfaa.SetFloat(
"_OffsetScale", offsetScale);
166                 nfaa.SetFloat(
"_BlurRadius", blurRadius);
167
168                 Graphics.Blit(source, destination, nfaa, showGeneratedNormals ?
1 : 0);
169             }
170             
else
171             {
172                 
// none of the AA is supported, fallback to a simple blit
173                 Graphics.Blit(source, destination);
174             }
175         }
176     }
177 }


Tìm kết quả nhanh