using System;
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class PartBloom : MonoBehaviour
{
//采样率
public int samplerScale = 1;
//高亮部分提取阈值
public Color colorThreshold = Color.gray;
//Bloom泛光颜色
public Color bloomColor = Color.white;
//Bloom权值
[Range(0.0f, 1.0f)]
public float bloomFactor = 0.5f;
///
/// Bloom材质球
///
public Material m_bloom_mat = null;
///
/// 特定渲染图
///
[SerializeField]
private RenderTexture m_R;
RenderTexture temp1;
RenderTexture temp2;
private Camera rt_bloom_camera;
void Start()
{
rt_bloom_camera = GameObject.Find("BloomCamera").GetComponent();
Debug.Log(rt_bloom_camera.name);
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (m_bloom_mat != null && rt_bloom_camera != null)
{
m_R = rt_bloom_camera.targetTexture;
// m_R = RenderTexture.GetTemporary(source.width / 2, source.height / 2, 0);
temp1 = RenderTexture.GetTemporary(m_R.width, m_R.height, 0);
temp2 = RenderTexture.GetTemporary(m_R.width, m_R.height, 0);
//复制泛光图
Graphics.Blit(m_R, temp1);
//根据阈值提取高亮部分,使用pass0进行高亮提取
m_bloom_mat.SetVector("_colorThreshold", colorThreshold);
Graphics.Blit(temp1, temp2, m_bloom_mat, 0);
//高斯模糊,两次模糊,横向纵向,使用pass1进行高斯模糊
m_bloom_mat.SetVector("_offsets", new Vector4(0, samplerScale, 0, 0));
Graphics.Blit(temp2, temp1, m_bloom_mat, 1);
m_bloom_mat.SetVector("_offsets", new Vector4(samplerScale, 0, 0, 0));
Graphics.Blit(temp1, temp2, m_bloom_mat, 1);
//Bloom,将模糊后的图作为Material的Blur图参数
m_bloom_mat.SetTexture("_BlurTex", temp2);
m_bloom_mat.SetVector("_bloomColor", bloomColor);
m_bloom_mat.SetFloat("_bloomFactor", bloomFactor);
//使用pass2进行景深效果计算,清晰场景图直接从source输入到shader的_MainTex中
Graphics.Blit(source, destination, m_bloom_mat, 2);
rt_bloom_camera.targetTexture = m_R;
//释放申请的RT
RenderTexture.ReleaseTemporary(temp1);
RenderTexture.ReleaseTemporary(temp2);
}
}
public void SetMaterialRT(RenderTexture rt)
{
// m_R = rt;
}
}