public class Bloom
{
private int m_HDRBloomGaussianPass;
private Material m_HDRPostProcessMaterial;
private readonly float m_sigma1 = Mathf.Sqrt(0.008f);
private readonly float m_sigma2 = Mathf.Sqrt(0.0568f);
private readonly int m_HDRBloomParamsProperty = Shader.PropertyToID("_HDRBloomParams");
private readonly int m_HDRBloomParams2Property = Shader.PropertyToID("_HDRBloomParams2");
private readonly int m_HDRBloomParams3Property = Shader.PropertyToID("_HDRBloomParams3");
private readonly int m_HDRBloomParams4Property = Shader.PropertyToID("_HDRBloomParams4");
private readonly int m_HDRBloom_TempProperty = Shader.PropertyToID("_HDRBloom_Temp");
private readonly int m_HDRBloom_Temp2Property = Shader.PropertyToID("_HDRBloom_Temp2");
private readonly int m_HDRBloomPassCountProperty = Shader.PropertyToID("_HDRBloomPassCount");
private Vector4 m_passFirstHorBloomParams;
private Vector4 m_passFirstVerBloomParams;
private Vector4 m_passSecondHorBloomParams;
private Vector4 m_passSecondVerBloomParams;
public void Deinitialize()
{
}
public bool Initialize(CommandBuffer commandBuffer)
{
Deinitialize();
if (HDRTargetRTs.IsReady == false) return false;
if (m_HDRPostProcessMaterial == null)
{
var shader = Shader.Find("Renderer/HDRPostProcess");
if (shader == null) return false;
m_HDRPostProcessMaterial = new Material(shader);
}
m_HDRPostProcessMaterial.name = "HDRPostProcess";
m_HDRBloomGaussianPass = m_HDRPostProcessMaterial.FindPass("HDRBloomGaussian");
{
commandBuffer.SetGlobalInt(m_HDRBloomPassCountProperty, 1);
commandBuffer.SetGlobalTexture(m_HDRBloom_TempProperty, HDRTargetRTs.m_rtHDRTargetScaled[1][0]);
commandBuffer.Blit(HDRTargetRTs.m_rtHDRTargetScaled[1][0], HDRTargetRTs.m_rtHDRTargetScaled[1][1], m_HDRPostProcessMaterial, m_HDRBloomGaussianPass);
}
{
commandBuffer.SetGlobalInt(m_HDRBloomPassCountProperty, 2);
commandBuffer.SetGlobalTexture(m_HDRBloom_TempProperty, HDRTargetRTs.m_rtHDRTargetScaled[1][1]);
commandBuffer.Blit(HDRTargetRTs.m_rtHDRTargetScaled[1][1], HDRTargetRTs.m_rtHDRTargetScaled[1][0], m_HDRPostProcessMaterial, m_HDRBloomGaussianPass);
}
{
commandBuffer.SetGlobalInt(m_HDRBloomPassCountProperty, 3);
commandBuffer.SetGlobalTexture(m_HDRBloom_TempProperty, HDRTargetRTs.m_rtHDRTargetScaled[1][0]);
commandBuffer.Blit(HDRTargetRTs.m_rtHDRTargetScaled[1][0], HDRTargetRTs.m_rtHDRTargetScaled[1][1], m_HDRPostProcessMaterial, m_HDRBloomGaussianPass);
}
{
commandBuffer.SetGlobalInt(m_HDRBloomPassCountProperty, 4);
commandBuffer.SetGlobalTexture(m_HDRBloom_TempProperty, HDRTargetRTs.m_rtHDRTargetScaled[1][1]);
commandBuffer.SetGlobalTexture(m_HDRBloom_Temp2Property, HDRTargetRTs.m_rtHDRTargetScaled[1][0]);
commandBuffer.Blit(HDRTargetRTs.m_rtHDRTargetScaled[1][1], HDRTargetRTs.m_rtHDRFinalBloom, m_HDRPostProcessMaterial, m_HDRBloomGaussianPass);
}
return true;
}
public void Update()
{
int width = HDRTargetRTs.m_rtHDRFinalBloom.width;
int height = HDRTargetRTs.m_rtHDRFinalBloom.height;
float scaleW = ((float)width / 400.0f) / (float)width;
float scaleH = ((float)height / 225.0f) / (float)height;
m_passFirstHorBloomParams = new Vector4(scaleW, 0, 0, 0);
m_passFirstVerBloomParams = new Vector4(0, scaleH, 0, 0);
m_passSecondHorBloomParams = new Vector4((m_sigma2 / m_sigma1) * scaleW, 0, 0, 0);
m_passSecondVerBloomParams = new Vector4(0, (m_sigma2 / m_sigma1) * scaleH, 0, 0);
Shader.SetGlobalVector(m_HDRBloomParamsProperty, m_passFirstHorBloomParams);
Shader.SetGlobalVector(m_HDRBloomParams2Property, m_passFirstVerBloomParams);
Shader.SetGlobalVector(m_HDRBloomParams3Property, m_passSecondHorBloomParams);
Shader.SetGlobalVector(m_HDRBloomParams4Property, m_passSecondVerBloomParams);
}
}