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