Files
Main/Assets/Launcher/ExternalLibs/AnimPostEffect/AnimBloom.cs

123 lines
4.4 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using UnityEngine;
namespace Thousandto.Launcher.ExternalLibs
{
public class AnimBloom : MonoBehaviour
{
[SerializeField]
int m_downSampleFactor = 4;
[SerializeField]
int m_blurIterations = 1;
[SerializeField]
[Range(0.25f, 5.0f)]
private float m_blurSize = 1.0f;
[SerializeField]
[Range(0.0f, 2.0f)]
float m_threshhold = 0.78f;
[SerializeField]
[Range(0.0f, 2.5f)]
float m_intensity = 0.75f; // downSample ctrl, color adjust
private Shader ms_downSampleShader = null;
private Shader ms_gaussianBlurShader = null;
private Shader ms_compositeShader = null;
private Material ms_downSampleMaterial = null;
private Material ms_gaussianBlurMaterial = null;
private Material ms_compositeMaterial = null;
void OnDestroy()
{
OnDisable();
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
CheckResources();
int width = source.width / m_downSampleFactor;
int height = source.width / m_downSampleFactor;
RenderTexture rt = RenderTexture.GetTemporary(width, height, 0, source.format);
rt.filterMode = FilterMode.Bilinear;
rt.antiAliasing = 1;
rt.name = "RenderTexture4";
// down sample and extract
ms_downSampleMaterial.SetVector("_Parameter", new Vector4(1.0f, 0.0f, m_threshhold, m_intensity));
Graphics.Blit(source, rt, ms_downSampleMaterial);
// do gaussian blur
for (int i = 0; i < m_blurIterations; ++i)
{
//v blur
RenderTexture rt1 = RenderTexture.GetTemporary(width, height, 0, source.format);
rt1.name = "RenderTexture5";
rt1.antiAliasing = 1;
rt1.filterMode = FilterMode.Bilinear;
ms_gaussianBlurMaterial.SetVector("_Parameter", new Vector4(0.0f, 1.0f, (m_blurSize + (i * 1.0f)), 0.0f));
Graphics.Blit(rt, rt1, ms_gaussianBlurMaterial);
RenderTexture.ReleaseTemporary(rt);
rt = rt1;
// h blur
rt1 = RenderTexture.GetTemporary(width, height, 0, source.format);
rt1.name = "RenderTexture6";
rt1.filterMode = FilterMode.Bilinear;
rt1.antiAliasing = 1;
ms_gaussianBlurMaterial.SetVector("_Parameter", new Vector4(1.0f, 0.0f, (m_blurSize + (i * 1.0f)), 0.0f));
Graphics.Blit(rt, rt1, ms_gaussianBlurMaterial);
RenderTexture.ReleaseTemporary(rt);
rt = rt1;
}
// composite bloom
ms_compositeMaterial.SetTexture("_BloomTex", rt);
Graphics.Blit(source, destination, ms_compositeMaterial);
RenderTexture.ReleaseTemporary(rt);
}
void OnDisable()
{
if (ms_downSampleMaterial != null)
{
UnityEngine.Object.Destroy(ms_downSampleMaterial);
ms_downSampleMaterial = null;
}
if (ms_gaussianBlurMaterial != null)
{
UnityEngine.Object.Destroy(ms_gaussianBlurMaterial);
ms_gaussianBlurMaterial = null;
}
if (ms_compositeMaterial != null)
{
UnityEngine.Object.Destroy(ms_compositeMaterial);
ms_compositeMaterial = null;
}
}
void OnEnable()
{
CheckResources();
}
void CheckResources()
{
if (ms_downSampleShader == null)
ms_downSampleShader = ShaderFactory.Find("Ares/Bloom/BloomExtractPass");
if (ms_gaussianBlurShader == null)
ms_gaussianBlurShader = ShaderFactory.Find("Ares/Bloom/BloomGaussianBlurPass");
if (ms_compositeShader == null)
ms_compositeShader = ShaderFactory.Find("Ares/Bloom/BloomCompositePass");
if (ms_downSampleMaterial == null)
ms_downSampleMaterial = new Material(ms_downSampleShader);
if (ms_gaussianBlurMaterial == null)
ms_gaussianBlurMaterial = new Material(ms_gaussianBlurShader);
if (ms_compositeMaterial == null)
ms_compositeMaterial = new Material(ms_compositeShader);
}
}
}