33 [RequireComponent(typeof(Camera))]
34 [AddComponentMenu(
"Image Effects/Bloom and Glow/BloomAndFlares (3.5, Deprecated)")]
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;
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);
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);
102 if (CheckResources() ==
false)
104 Graphics.Blit(source, destination);
112 doHdr = source.format == RenderTextureFormat.ARGBHalf && GetComponent<Camera>().hdr;
118 doHdr = doHdr && supportHDRTextures;
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();
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);
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);
Shader addBrightStuffOneOneShader
void Vignette(float amount, RenderTexture from, RenderTexture to)
void OnRenderImage(RenderTexture source, RenderTexture destination)
Material lensFlareMaterial
Shader hollywoodFlaresShader
Material hollywoodFlaresMaterial
Material addBrightStuffBlendOneOneMaterial
void AddTo(float intensity_, RenderTexture from, RenderTexture to)
Shader brightPassFilterShader
Texture2D lensFlareVignetteMask
void BrightFilter(float thresh, float useAlphaAsMask, RenderTexture from, RenderTexture to)
void BlendFlares(RenderTexture from, RenderTexture to)
Material separableBlurMaterial
Material brightPassFilterMaterial
Shader separableBlurShader
override bool CheckResources()
Material vignetteMaterial