123 lines
4.4 KiB
C#
123 lines
4.4 KiB
C#
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);
|
|
}
|
|
}
|
|
} |