summaryrefslogtreecommitdiff
path: root/UnityEngine.PostProcessing/BloomComponent.cs
diff options
context:
space:
mode:
Diffstat (limited to 'UnityEngine.PostProcessing/BloomComponent.cs')
-rw-r--r--UnityEngine.PostProcessing/BloomComponent.cs106
1 files changed, 106 insertions, 0 deletions
diff --git a/UnityEngine.PostProcessing/BloomComponent.cs b/UnityEngine.PostProcessing/BloomComponent.cs
new file mode 100644
index 0000000..aeec498
--- /dev/null
+++ b/UnityEngine.PostProcessing/BloomComponent.cs
@@ -0,0 +1,106 @@
+namespace UnityEngine.PostProcessing;
+
+public sealed class BloomComponent : PostProcessingComponentRenderTexture<BloomModel>
+{
+ private static class Uniforms
+ {
+ internal static readonly int _AutoExposure = Shader.PropertyToID("_AutoExposure");
+
+ internal static readonly int _Threshold = Shader.PropertyToID("_Threshold");
+
+ internal static readonly int _Curve = Shader.PropertyToID("_Curve");
+
+ internal static readonly int _PrefilterOffs = Shader.PropertyToID("_PrefilterOffs");
+
+ internal static readonly int _SampleScale = Shader.PropertyToID("_SampleScale");
+
+ internal static readonly int _BaseTex = Shader.PropertyToID("_BaseTex");
+
+ internal static readonly int _BloomTex = Shader.PropertyToID("_BloomTex");
+
+ internal static readonly int _Bloom_Settings = Shader.PropertyToID("_Bloom_Settings");
+
+ internal static readonly int _Bloom_DirtTex = Shader.PropertyToID("_Bloom_DirtTex");
+
+ internal static readonly int _Bloom_DirtIntensity = Shader.PropertyToID("_Bloom_DirtIntensity");
+ }
+
+ private const int k_MaxPyramidBlurLevel = 16;
+
+ private readonly RenderTexture[] m_BlurBuffer1 = new RenderTexture[16];
+
+ private readonly RenderTexture[] m_BlurBuffer2 = new RenderTexture[16];
+
+ public override bool active => base.model.enabled && base.model.settings.bloom.intensity > 0f && !context.interrupted;
+
+ public void Prepare(RenderTexture source, Material uberMaterial, Texture autoExposure)
+ {
+ BloomModel.BloomSettings bloom = base.model.settings.bloom;
+ BloomModel.LensDirtSettings lensDirt = base.model.settings.lensDirt;
+ Material material = context.materialFactory.Get("Hidden/Post FX/Bloom");
+ material.shaderKeywords = null;
+ material.SetTexture(Uniforms._AutoExposure, autoExposure);
+ int width = context.width / 2;
+ int num = context.height / 2;
+ RenderTextureFormat format = ((!Application.isMobilePlatform) ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default);
+ float num2 = Mathf.Log(num, 2f) + bloom.radius - 8f;
+ int num3 = (int)num2;
+ int num4 = Mathf.Clamp(num3, 1, 16);
+ float thresholdLinear = bloom.thresholdLinear;
+ material.SetFloat(Uniforms._Threshold, thresholdLinear);
+ float num5 = thresholdLinear * bloom.softKnee + 1E-05f;
+ material.SetVector(value: new Vector3(thresholdLinear - num5, num5 * 2f, 0.25f / num5), nameID: Uniforms._Curve);
+ material.SetFloat(Uniforms._PrefilterOffs, (!bloom.antiFlicker) ? 0f : (-0.5f));
+ float num6 = 0.5f + num2 - (float)num3;
+ material.SetFloat(Uniforms._SampleScale, num6);
+ if (bloom.antiFlicker)
+ {
+ material.EnableKeyword("ANTI_FLICKER");
+ }
+ RenderTexture renderTexture = context.renderTextureFactory.Get(width, num, 0, format);
+ Graphics.Blit(source, renderTexture, material, 0);
+ RenderTexture renderTexture2 = renderTexture;
+ for (int i = 0; i < num4; i++)
+ {
+ m_BlurBuffer1[i] = context.renderTextureFactory.Get(renderTexture2.width / 2, renderTexture2.height / 2, 0, format);
+ int pass = ((i == 0) ? 1 : 2);
+ Graphics.Blit(renderTexture2, m_BlurBuffer1[i], material, pass);
+ renderTexture2 = m_BlurBuffer1[i];
+ }
+ for (int num7 = num4 - 2; num7 >= 0; num7--)
+ {
+ RenderTexture renderTexture3 = m_BlurBuffer1[num7];
+ material.SetTexture(Uniforms._BaseTex, renderTexture3);
+ m_BlurBuffer2[num7] = context.renderTextureFactory.Get(renderTexture3.width, renderTexture3.height, 0, format);
+ Graphics.Blit(renderTexture2, m_BlurBuffer2[num7], material, 3);
+ renderTexture2 = m_BlurBuffer2[num7];
+ }
+ RenderTexture renderTexture4 = renderTexture2;
+ for (int j = 0; j < 16; j++)
+ {
+ if (m_BlurBuffer1[j] != null)
+ {
+ context.renderTextureFactory.Release(m_BlurBuffer1[j]);
+ }
+ if (m_BlurBuffer2[j] != null && m_BlurBuffer2[j] != renderTexture4)
+ {
+ context.renderTextureFactory.Release(m_BlurBuffer2[j]);
+ }
+ m_BlurBuffer1[j] = null;
+ m_BlurBuffer2[j] = null;
+ }
+ context.renderTextureFactory.Release(renderTexture);
+ uberMaterial.SetTexture(Uniforms._BloomTex, renderTexture4);
+ uberMaterial.SetVector(Uniforms._Bloom_Settings, new Vector2(num6, bloom.intensity));
+ if (lensDirt.intensity > 0f && lensDirt.texture != null)
+ {
+ uberMaterial.SetTexture(Uniforms._Bloom_DirtTex, lensDirt.texture);
+ uberMaterial.SetFloat(Uniforms._Bloom_DirtIntensity, lensDirt.intensity);
+ uberMaterial.EnableKeyword("BLOOM_LENS_DIRT");
+ }
+ else
+ {
+ uberMaterial.EnableKeyword("BLOOM");
+ }
+ }
+}