unity3d后期效果的重影

后期效果对于unity来说还是挺耗性能的,因为是对整屏幕逐像素计算,c#代码:

using UnityEngine;
public class _MotionBlur_1 : MonoBehaviour
{
	public float blurAmount = 0.8f;
    public Shader shader;
    private Material mat;
	public RenderTexture accumTexture;
	 void Start()
	{
        mat = new Material(shader);	//创建一个材质
        mat.hideFlags = HideFlags.HideAndDontSave;
	}
	void OnRenderImage (RenderTexture src, RenderTexture dst)
	{
		if (accumTexture == null)
		{
			accumTexture = new RenderTexture(src.width, src.height, 0);
			accumTexture.hideFlags = HideFlags.HideAndDontSave;
			Graphics.Blit( src, accumTexture );		//将最初的屏幕画面复制到accumTexture里面
		}
		blurAmount = Mathf.Clamp( blurAmount, 0.0f, 1f );	
		mat.SetTexture("_AccumTex", accumTexture);	//指定着色器中参数_AccumTex为accumTexture
		mat.SetFloat("_AccumAmt", blurAmount);		//设置着色器中参数_AccumAmt为blurAmount
		
		Graphics.Blit (src, accumTexture, mat);		//将屏幕当前画面与accumTexture合并
        Graphics.Blit(accumTexture, dst);			//将合并后的最终画面输出到dst
	}
}
接下来着色器会对
mat.SetTexture("_AccumTex", accumTexture);	//指定着色器中参数_AccumTex为accumTexture
mat.SetFloat("_AccumAmt", blurAmount);		//设置着色器中参数_AccumAmt为blurAmount
</pre><pre name="code" class="csharp">这两个参数进行计算,主要是造成了残影效果,我们看看shader具体实现:
</pre><pre name="code" class="cpp">Shader "Tut/Effects/MotionBlur_1" {
Properties {
	_MainTex ("Base (RGB)", 2D) = "white" {}
	_AccumTex("Accum Tex",2D)=""{}						//c#中传进来的纹理
	_AccumAmt("AccumOrig", Float) = 0.65					//c#中传进来的纹理
}
SubShader { 
	ZTest Always Cull Off ZWrite Off
	Fog { Mode off }
	Pass {
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		struct v2f {
			float4 vertex : POSITION;
			float2 uv : TEXCOORD;
		};
		v2f vert (appdata_base v)
		{
			v2f o;
			o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
			o.uv =v.texcoord;
			return o;
		}
		sampler2D _MainTex;
		sampler2D _AccumTex;
		float _AccumAmt;
		half4 frag (v2f i) : COLOR
		{
			half4 acc=tex2D(_AccumTex,i.uv);
			half4 current=tex2D(_MainTex, i.uv);		//屏幕当前纹理
			acc=acc*_AccumAmt+current*(1-_AccumAmt);	//将屏幕当前纹理与保存的纹理按照_AccumAmt与(1-_AccumAmt)的比例合并
			return acc;
		}
		ENDCG 
	} 
}
Fallback off
}
acc=acc*_AccumAmt+current*(1-_AccumAmt);这句是关键代码,acc乘上一个小于1的系数,则造成了指数递减的残影

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁工123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值