源战役客户端
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 

79 Zeilen
2.6 KiB

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;
/// <summary>
/// Bloom材质球
/// </summary>
public Material m_bloom_mat = null;
/// <summary>
/// 特定渲染图
/// </summary>
[SerializeField]
private RenderTexture m_R;
RenderTexture temp1;
RenderTexture temp2;
private Camera rt_bloom_camera;
void Start()
{
rt_bloom_camera = GameObject.Find("BloomCamera").GetComponent<Camera>();
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;
}
}