4 namespace UnityStandardAssets.ImageEffects
7 [RequireComponent (typeof(Camera))]
8 [AddComponentMenu (
"Image Effects/Bloom and Glow/Bloom")]
11 public enum LensFlareStyle
24 public enum HDRBloomMode
31 public enum BloomScreenBlendMode
37 public enum BloomQuality
43 public TweakMode tweakMode = 0;
44 public BloomScreenBlendMode screenBlendMode = BloomScreenBlendMode.Add;
46 public HDRBloomMode hdr = HDRBloomMode.Auto;
47 private bool doHdr =
false;
48 public float sepBlurSpread = 2.5f;
50 public BloomQuality quality = BloomQuality.High;
52 public float bloomIntensity = 0.5f;
53 public float bloomThreshold = 0.5f;
54 public Color bloomThresholdColor = Color.white;
55 public int bloomBlurIterations = 2;
57 public int hollywoodFlareBlurIterations = 2;
58 public float flareRotation = 0.0f;
59 public LensFlareStyle lensflareMode = (LensFlareStyle) 1;
60 public float hollyStretchWidth = 2.5f;
61 public float lensflareIntensity = 0.0f;
62 public float lensflareThreshold = 0.3f;
63 public float lensFlareSaturation = 0.75f;
64 public Color flareColorA =
new Color (0.4f, 0.4f, 0.8f, 0.75f);
65 public Color flareColorB =
new Color (0.4f, 0.8f, 0.8f, 0.75f);
66 public Color flareColorC =
new Color (0.8f, 0.4f, 0.8f, 0.75f);
67 public Color flareColorD =
new Color (0.8f, 0.4f, 0.0f, 0.75f);
68 public Texture2D lensFlareVignetteMask;
70 public Shader lensFlareShader;
71 private Material lensFlareMaterial;
73 public Shader screenBlendShader;
74 private Material screenBlend;
76 public Shader blurAndFlaresShader;
77 private Material blurAndFlaresMaterial;
79 public Shader brightPassFilterShader;
80 private Material brightPassFilterMaterial;
83 public override bool CheckResources ()
87 screenBlend = CheckShaderAndCreateMaterial (screenBlendShader, screenBlend);
88 lensFlareMaterial = CheckShaderAndCreateMaterial(lensFlareShader,lensFlareMaterial);
89 blurAndFlaresMaterial = CheckShaderAndCreateMaterial (blurAndFlaresShader, blurAndFlaresMaterial);
90 brightPassFilterMaterial = CheckShaderAndCreateMaterial(brightPassFilterShader, brightPassFilterMaterial);
97 public void OnRenderImage (RenderTexture source, RenderTexture destination)
99 if (CheckResources()==
false)
101 Graphics.Blit (source, destination);
108 if (hdr == HDRBloomMode.Auto)
109 doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent<Camera>().hdr;
111 doHdr = hdr == HDRBloomMode.On;
114 doHdr = doHdr && supportHDRTextures;
116 BloomScreenBlendMode realBlendMode = screenBlendMode;
118 realBlendMode = BloomScreenBlendMode.Add;
120 var rtFormat= (doHdr) ? RenderTextureFormat.ARGBHalf : RenderTextureFormat.Default;
121 var rtW2= source.width/2;
122 var rtH2= source.height/2;
123 var rtW4= source.width/4;
124 var rtH4= source.height/4;
126 float widthOverHeight = (1.0f * source.width) / (1.0f * source.height);
127 float oneOverBaseSize = 1.0f / 512.0f;
130 RenderTexture quarterRezColor = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
131 RenderTexture halfRezColorDown = RenderTexture.GetTemporary (rtW2, rtH2, 0, rtFormat);
132 if (quality > BloomQuality.Cheap) {
133 Graphics.Blit (source, halfRezColorDown, screenBlend, 2);
134 RenderTexture rtDown4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
135 Graphics.Blit (halfRezColorDown, rtDown4, screenBlend, 2);
136 Graphics.Blit (rtDown4, quarterRezColor, screenBlend, 6);
137 RenderTexture.ReleaseTemporary(rtDown4);
140 Graphics.Blit (source, halfRezColorDown);
141 Graphics.Blit (halfRezColorDown, quarterRezColor, screenBlend, 6);
143 RenderTexture.ReleaseTemporary (halfRezColorDown);
146 RenderTexture secondQuarterRezColor = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
147 BrightFilter (bloomThreshold * bloomThresholdColor, quarterRezColor, secondQuarterRezColor);
151 if (bloomBlurIterations < 1) bloomBlurIterations = 1;
152 else if (bloomBlurIterations > 10) bloomBlurIterations = 10;
154 for (
int iter = 0; iter < bloomBlurIterations; iter++)
156 float spreadForPass = (1.0f + (iter * 0.25f)) * sepBlurSpread;
159 RenderTexture blur4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
160 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (0.0f, spreadForPass * oneOverBaseSize, 0.0f, 0.0f));
161 Graphics.Blit (secondQuarterRezColor, blur4, blurAndFlaresMaterial, 4);
162 RenderTexture.ReleaseTemporary(secondQuarterRezColor);
163 secondQuarterRezColor = blur4;
166 blur4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
167 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 ((spreadForPass / widthOverHeight) * oneOverBaseSize, 0.0f, 0.0f, 0.0f));
168 Graphics.Blit (secondQuarterRezColor, blur4, blurAndFlaresMaterial, 4);
169 RenderTexture.ReleaseTemporary (secondQuarterRezColor);
170 secondQuarterRezColor = blur4;
172 if (quality > BloomQuality.Cheap)
176 Graphics.SetRenderTarget(quarterRezColor);
177 GL.Clear(
false,
true, Color.black);
178 Graphics.Blit (secondQuarterRezColor, quarterRezColor);
182 quarterRezColor.MarkRestoreExpected();
183 Graphics.Blit (secondQuarterRezColor, quarterRezColor, screenBlend, 10);
188 if (quality > BloomQuality.Cheap)
190 Graphics.SetRenderTarget(secondQuarterRezColor);
191 GL.Clear(
false,
true, Color.black);
192 Graphics.Blit (quarterRezColor, secondQuarterRezColor, screenBlend, 6);
197 if (lensflareIntensity > Mathf.Epsilon)
200 RenderTexture rtFlares4 = RenderTexture.GetTemporary (rtW4, rtH4, 0, rtFormat);
202 if (lensflareMode == 0)
206 BrightFilter (lensflareThreshold, secondQuarterRezColor, rtFlares4);
208 if (quality > BloomQuality.Cheap)
211 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (0.0f, (1.5f) / (1.0f * quarterRezColor.height), 0.0f, 0.0f));
212 Graphics.SetRenderTarget(quarterRezColor);
213 GL.Clear(
false,
true, Color.black);
214 Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 4);
216 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 ((1.5f) / (1.0f * quarterRezColor.width), 0.0f, 0.0f, 0.0f));
217 Graphics.SetRenderTarget(rtFlares4);
218 GL.Clear(
false,
true, Color.black);
219 Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 4);
223 Vignette (0.975f, rtFlares4, rtFlares4);
224 BlendFlares (rtFlares4, secondQuarterRezColor);
232 float flareXRot = 1.0f * Mathf.Cos(flareRotation);
233 float flareyRot = 1.0f * Mathf.Sin(flareRotation);
235 float stretchWidth = (hollyStretchWidth * 1.0f / widthOverHeight) * oneOverBaseSize;
237 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (flareXRot, flareyRot, 0.0f, 0.0f));
238 blurAndFlaresMaterial.SetVector (
"_Threshhold",
new Vector4 (lensflareThreshold, 1.0f, 0.0f, 0.0f));
239 blurAndFlaresMaterial.SetVector (
"_TintColor",
new Vector4 (flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * flareColorA.a * lensflareIntensity);
240 blurAndFlaresMaterial.SetFloat (
"_Saturation", lensFlareSaturation);
243 quarterRezColor.DiscardContents();
244 Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 2);
246 rtFlares4.DiscardContents();
247 Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 3);
249 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (flareXRot * stretchWidth, flareyRot * stretchWidth, 0.0f, 0.0f));
251 blurAndFlaresMaterial.SetFloat (
"_StretchWidth", hollyStretchWidth);
252 quarterRezColor.DiscardContents();
253 Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 1);
255 blurAndFlaresMaterial.SetFloat (
"_StretchWidth", hollyStretchWidth * 2.0f);
256 rtFlares4.DiscardContents();
257 Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 1);
259 blurAndFlaresMaterial.SetFloat (
"_StretchWidth", hollyStretchWidth * 4.0f);
260 quarterRezColor.DiscardContents();
261 Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 1);
264 for (
int iter = 0; iter < hollywoodFlareBlurIterations; iter++)
266 stretchWidth = (hollyStretchWidth * 2.0f / widthOverHeight) * oneOverBaseSize;
268 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (stretchWidth * flareXRot, stretchWidth * flareyRot, 0.0f, 0.0f));
269 rtFlares4.DiscardContents();
270 Graphics.Blit (quarterRezColor, rtFlares4, blurAndFlaresMaterial, 4);
272 blurAndFlaresMaterial.SetVector (
"_Offsets",
new Vector4 (stretchWidth * flareXRot, stretchWidth * flareyRot, 0.0f, 0.0f));
273 quarterRezColor.DiscardContents();
274 Graphics.Blit (rtFlares4, quarterRezColor, blurAndFlaresMaterial, 4);
277 if (lensflareMode == (LensFlareStyle) 1)
279 AddTo (1.0f, quarterRezColor, secondQuarterRezColor);
284 Vignette (1.0f, quarterRezColor, rtFlares4);
285 BlendFlares (rtFlares4, quarterRezColor);
286 AddTo (1.0f, quarterRezColor, secondQuarterRezColor);
289 RenderTexture.ReleaseTemporary (rtFlares4);
292 int blendPass = (int) realBlendMode;
296 screenBlend.SetFloat (
"_Intensity", bloomIntensity);
297 screenBlend.SetTexture (
"_ColorBuffer", source);
299 if (quality > BloomQuality.Cheap)
301 RenderTexture halfRezColorUp = RenderTexture.GetTemporary (rtW2, rtH2, 0, rtFormat);
302 Graphics.Blit (secondQuarterRezColor, halfRezColorUp);
303 Graphics.Blit (halfRezColorUp, destination, screenBlend, blendPass);
304 RenderTexture.ReleaseTemporary (halfRezColorUp);
307 Graphics.Blit (secondQuarterRezColor, destination, screenBlend, blendPass);
309 RenderTexture.ReleaseTemporary (quarterRezColor);
310 RenderTexture.ReleaseTemporary (secondQuarterRezColor);
313 private void AddTo (
float intensity_, RenderTexture from, RenderTexture to)
315 screenBlend.SetFloat (
"_Intensity", intensity_);
316 to.MarkRestoreExpected();
317 Graphics.Blit (from, to, screenBlend, 9);
320 private void BlendFlares (RenderTexture from, RenderTexture to)
322 lensFlareMaterial.SetVector (
"colorA",
new Vector4 (flareColorA.r, flareColorA.g, flareColorA.b, flareColorA.a) * lensflareIntensity);
323 lensFlareMaterial.SetVector (
"colorB",
new Vector4 (flareColorB.r, flareColorB.g, flareColorB.b, flareColorB.a) * lensflareIntensity);
324 lensFlareMaterial.SetVector (
"colorC",
new Vector4 (flareColorC.r, flareColorC.g, flareColorC.b, flareColorC.a) * lensflareIntensity);
325 lensFlareMaterial.SetVector (
"colorD",
new Vector4 (flareColorD.r, flareColorD.g, flareColorD.b, flareColorD.a) * lensflareIntensity);
326 to.MarkRestoreExpected();
327 Graphics.Blit (from, to, lensFlareMaterial);
330 private void BrightFilter (
float thresh, RenderTexture from, RenderTexture to)
332 brightPassFilterMaterial.SetVector (
"_Threshhold",
new Vector4 (thresh, thresh, thresh, thresh));
333 Graphics.Blit (from, to, brightPassFilterMaterial, 0);
336 private void BrightFilter (Color threshColor, RenderTexture from, RenderTexture to)
338 brightPassFilterMaterial.SetVector (
"_Threshhold", threshColor);
339 Graphics.Blit (from, to, brightPassFilterMaterial, 1);
342 private void Vignette (
float amount, RenderTexture from, RenderTexture to)
344 if (lensFlareVignetteMask)
346 screenBlend.SetTexture (
"_ColorBuffer", lensFlareVignetteMask);
347 to.MarkRestoreExpected();
348 Graphics.Blit (from == to ? null : from, to, screenBlend, from == to ? 7 : 3);
352 Graphics.SetRenderTarget (to);
353 GL.Clear(
false,
true, Color.black);
354 Graphics.Blit (from, to);