Unity Shader屏幕后处理 运动模糊

本文介绍了Unity中实现运动模糊的两种方法:累积缓存混合图像和使用速度缓存。第一种方法性能消耗大,而第二种通过存储像素运动速度决定模糊方向和大小,更节省资源。文章还涉及了脚本和Shader的具体实现,以模拟运动模糊效果。
摘要由CSDN通过智能技术生成

原理

一种实现方法是利用一块累积缓存来混合多张连续的图像,当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的运动模糊图像。然而这种暴力的方法对性能的消耗很大.

另一种应用广泛的方法是创建和使用速度缓存,这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小.

我们使用类似上述第一种方法实现来模拟运动模糊的效果,我们不需要在一帧中把场景渲染多次,但需要保存之间的渲染结果,不断把当前的渲染图像叠加到之前的渲染图像中,从而产生一种运动轨迹的视觉效果,这样方法性能更好,但模糊效果可能会略差.

脚本实现:

using UnityEngine;
using System.Collections;

public class MotionBlur : PostEffectsBase
{

    public Shader motionBlurShader;
    private Material motionBlurMaterial = null;

    public Material material
    {
        get
        {
            motionBlurMaterial = CheckShaderAndCreateMaterial(motionBlurShader, motionBlurMaterial);
            return motionBlurMaterial;
        }
    }

    [Range(0.0f, 0.9f)]
    public float blurAmount = 0.5f;//模糊参数 数值越大,运动拖尾的效果越明显

    private RenderTexture accumulationTexture;//保存之前图像叠加的结果

    void OnDisable()
    {
        DestroyImmediate(accumulationTexture);//不运动时立刻调用销毁,希望在下一次开始新运动时重新叠加图像。
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (material != null)
        {

            if (accumulationTexture == null || accumulationTexture.width != src.width || accumulationTexture.height != src.height)
            {//判断是否为空,判断是否与当前的屏幕分辨率相等,如果不满足,重新创建一个
                DestroyImmediate(accumulationTexture);
                accumulationTexture = new RenderTexture(src.width, src.height, 0);
                accumulationTe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值