4 namespace UnityStandardAssets.ImageEffects
6 public enum LensflareStyle34
13 public enum TweakMode34
19 public enum HDRBloomMode
26 public enum BloomScreenBlendMode
33 [RequireComponent(typeof(Camera))]
34 [AddComponentMenu(
"Image Effects/Bloom and Glow/BloomAndFlares (3.5, Deprecated)")]
37 public TweakMode34 tweakMode = 0;
38 public BloomScreenBlendMode screenBlendMode = BloomScreenBlendMode.Add;
40 public HDRBloomMode hdr = HDRBloomMode.Auto;
41 private bool doHdr =
false;
42 public float sepBlurSpread = 1.5f;
43 public float useSrcAlphaAsMask = 0.5f;
45 public float bloomIntensity = 1.0f;
46 public float bloomThreshold = 0.5f;
47 public int bloomBlurIterations = 2;
49 public bool lensflares =
false;
50 public int hollywoodFlareBlurIterations = 2;
51 public LensflareStyle34 lensflareMode = (LensflareStyle34)1;
52 public float hollyStretchWidth = 3.5f;
53 public float lensflareIntensity = 1.0f;
54 public float lensflareThreshold = 0.3f;
55 public Color flareColorA =
new Color(0.4f, 0.4f, 0.8f, 0.75f);
56 public Color flareColorB =
new Color(0.4f, 0.8f, 0.8f, 0.75f);
57 public Color flareColorC =
new Color(0.8f, 0.4f, 0.8f, 0.75f);
58 public Color flareColorD =
new Color(0.8f, 0.4f, 0.0f, 0.75f);
59 public Texture2D lensFlareVignetteMask;
61 public Shader lensFlareShader;
62 private Material lensFlareMaterial;
64 public Shader vignetteShader;
65 private Material vignetteMaterial;
67 public Shader separableBlurShader;
68 private Material separableBlurMaterial;
70 public Shader addBrightStuffOneOneShader;
71 private Material addBrightStuffBlendOneOneMaterial;
73 public Shader screenBlendShader;
74 private Material screenBlend;
76 public Shader hollywoodFlaresShader;
77 private Material hollywoodFlaresMaterial;
79 public Shader brightPassFilterShader;
80 private Material brightPassFilterMaterial;
83 public override bool CheckResources()
87 screenBlend = CheckShaderAndCreateMaterial(screenBlendShader, screenBlend);
88 lensFlareMaterial = CheckShaderAndCreateMaterial(lensFlareShader, lensFlareMaterial);
89 vignetteMaterial = CheckShaderAndCreateMaterial(vignetteShader, vignetteMaterial);
90 separableBlurMaterial = CheckShaderAndCreateMaterial(separableBlurShader, separableBlurMaterial);
91 addBrightStuffBlendOneOneMaterial = CheckShaderAndCreateMaterial(addBrightStuffOneOneShader, addBrightStuffBlendOneOneMaterial);
92 hollywoodFlaresMaterial = CheckShaderAndCreateMaterial(hollywoodFlaresShader, hollywoodFlaresMaterial);
93 brightPassFilterMaterial = CheckShaderAndCreateMaterial(brightPassFilterShader, brightPassFilterMaterial);
100 void OnRenderImage(RenderTexture source, RenderTexture destination)
102 if (CheckResources() ==
false)
104 Graphics.Blit(source, destination);
111 if (hdr == HDRBloomMode.Auto)
112 doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent<Camera>().hdr;
115 doHdr = hdr == HDRBloomMode.On;
118 doHdr = doHdr && supportHDRTextures;
120 BloomScreenBlendMode realBlendMode = screenBlendMode;
122 realBlendMode = BloomScreenBlendMode.Add;
124 var rtFormat = (doHdr) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.Default;
125 RenderTexture halfRezColor = RenderTexture.GetTemporary(source.width / 2, source.height / 2, 0, rtFormat);
126 RenderTexture quarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat);
127 RenderTexture secondQuarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat);
128 RenderTexture thirdQuarterRezColor = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0, rtFormat);
130 float widthOverHeight = (1.0f * source.width) / (1.0f * source.height);
131 float oneOverBaseSize = 1.0f / 512.0f;
135 Graphics.Blit(source, halfRezColor, screenBlend, 2);
136 Graphics.Blit(halfRezColor, quarterRezColor, screenBlend, 2);
138 RenderTexture.ReleaseTemporary(halfRezColor);
142 BrightFilter(bloomThreshold, useSrcAlphaAsMask, quarterRezColor, secondQuarterRezColor);
143 quarterRezColor.DiscardContents();
147 if (bloomBlurIterations < 1) bloomBlurIterations = 1;
149 for (
int iter = 0; iter < bloomBlurIterations; iter++)
151 float spreadForPass = (1.0f + (iter * 0.5f)) * sepBlurSpread;
152 separableBlurMaterial.SetVector(
"offsets",
new Vector4(0.0f, spreadForPass * oneOverBaseSize, 0.0f, 0.0f));
154 RenderTexture src = iter == 0 ? secondQuarterRezColor : quarterRezColor;
155 Graphics.Blit(src, thirdQuarterRezColor, separableBlurMaterial);
156 src.DiscardContents();
158 separableBlurMaterial.SetVector(
"offsets",
new Vector4((spreadForPass / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
159 Graphics.Blit(thirdQuarterRezColor, quarterRezColor, separableBlurMaterial);
160 thirdQuarterRezColor.DiscardContents();
168 if (lensflareMode == 0)
171 BrightFilter(lensflareThreshold, 0.0f, quarterRezColor, thirdQuarterRezColor);
172 quarterRezColor.DiscardContents();
183 Vignette(0.975f, thirdQuarterRezColor, secondQuarterRezColor);
184 thirdQuarterRezColor.DiscardContents();
186 BlendFlares(secondQuarterRezColor, quarterRezColor);
187 secondQuarterRezColor.DiscardContents();
198 hollywoodFlaresMaterial.SetVector(
"_threshold",
new Vector4(lensflareThreshold, 1.0f / (1.0f - lensflareThreshold), 0.0f, 0.0f));
199 hollywoodFlaresMaterial.SetVector(
"tintColor",
new Vector4(flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * flareColorA.a * lensflareIntensity);
200 Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 2);
201 thirdQuarterRezColor.DiscardContents();
203 Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, hollywoodFlaresMaterial, 3);
204 secondQuarterRezColor.DiscardContents();
206 hollywoodFlaresMaterial.SetVector(
"offsets",
new Vector4((sepBlurSpread * 1.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
207 hollywoodFlaresMaterial.SetFloat(
"stretchWidth", hollyStretchWidth);
208 Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 1);
209 thirdQuarterRezColor.DiscardContents();
211 hollywoodFlaresMaterial.SetFloat(
"stretchWidth", hollyStretchWidth * 2.0f);
212 Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, hollywoodFlaresMaterial, 1);
213 secondQuarterRezColor.DiscardContents();
215 hollywoodFlaresMaterial.SetFloat(
"stretchWidth", hollyStretchWidth * 4.0f);
216 Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, hollywoodFlaresMaterial, 1);
217 thirdQuarterRezColor.DiscardContents();
219 if (lensflareMode == (LensflareStyle34)1)
221 for (
int itera = 0; itera < hollywoodFlareBlurIterations; itera++)
223 separableBlurMaterial.SetVector(
"offsets",
new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
224 Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, separableBlurMaterial);
225 secondQuarterRezColor.DiscardContents();
227 separableBlurMaterial.SetVector(
"offsets",
new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
228 Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, separableBlurMaterial);
229 thirdQuarterRezColor.DiscardContents();
232 AddTo(1.0f, secondQuarterRezColor, quarterRezColor);
233 secondQuarterRezColor.DiscardContents();
240 for (
int ix = 0; ix < hollywoodFlareBlurIterations; ix++)
242 separableBlurMaterial.SetVector(
"offsets",
new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
243 Graphics.Blit(secondQuarterRezColor, thirdQuarterRezColor, separableBlurMaterial);
244 secondQuarterRezColor.DiscardContents();
246 separableBlurMaterial.SetVector(
"offsets",
new Vector4((hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
247 Graphics.Blit(thirdQuarterRezColor, secondQuarterRezColor, separableBlurMaterial);
248 thirdQuarterRezColor.DiscardContents();
251 Vignette(1.0f, secondQuarterRezColor, thirdQuarterRezColor);
252 secondQuarterRezColor.DiscardContents();
254 BlendFlares(thirdQuarterRezColor, secondQuarterRezColor);
255 thirdQuarterRezColor.DiscardContents();
257 AddTo(1.0f, secondQuarterRezColor, quarterRezColor);
258 secondQuarterRezColor.DiscardContents();
265 screenBlend.SetFloat(
"_Intensity", bloomIntensity);
266 screenBlend.SetTexture(
"_ColorBuffer", source);
267 Graphics.Blit(quarterRezColor, destination, screenBlend, (int)realBlendMode);
269 RenderTexture.ReleaseTemporary(quarterRezColor);
270 RenderTexture.ReleaseTemporary(secondQuarterRezColor);
271 RenderTexture.ReleaseTemporary(thirdQuarterRezColor);
274 private void AddTo(
float intensity_, RenderTexture from, RenderTexture to)
276 addBrightStuffBlendOneOneMaterial.SetFloat(
"_Intensity", intensity_);
277 Graphics.Blit(from, to, addBrightStuffBlendOneOneMaterial);
280 private void BlendFlares(RenderTexture from, RenderTexture to)
282 lensFlareMaterial.SetVector(
"colorA",
new Vector4(flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * lensflareIntensity);
283 lensFlareMaterial.SetVector(
"colorB",
new Vector4(flareColorB.r, flareColorB.g, flareColorB.b, flareColorB.a) * lensflareIntensity);
284 lensFlareMaterial.SetVector(
"colorC",
new Vector4(flareColorC.r, flareColorC.g, flareColorC.b, flareColorC.a) * lensflareIntensity);
285 lensFlareMaterial.SetVector(
"colorD",
new Vector4(flareColorD.r, flareColorD.g, flareColorD.b, flareColorD.a) * lensflareIntensity);
286 Graphics.Blit(from, to, lensFlareMaterial);
289 private void BrightFilter(
float thresh,
float useAlphaAsMask, RenderTexture from, RenderTexture to)
292 brightPassFilterMaterial.SetVector(
"threshold",
new Vector4(thresh, 1.0f, 0.0f, 0.0f));
294 brightPassFilterMaterial.SetVector(
"threshold",
new Vector4(thresh, 1.0f / (1.0f - thresh), 0.0f, 0.0f));
295 brightPassFilterMaterial.SetFloat(
"useSrcAlphaAsMask", useAlphaAsMask);
296 Graphics.Blit(from, to, brightPassFilterMaterial);
299 private void Vignette(
float amount, RenderTexture from, RenderTexture to)
301 if (lensFlareVignetteMask)
303 screenBlend.SetTexture(
"_ColorBuffer", lensFlareVignetteMask);
304 Graphics.Blit(from, to, screenBlend, 3);
308 vignetteMaterial.SetFloat(
"vignetteIntensity", amount);
309 Graphics.Blit(from, to, vignetteMaterial);