原理
一种实现方法是利用一块累积缓存来混合多张连续的图像,当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的运动模糊图像。然而这种暴力的方法对性能的消耗很大.
另一种应用广泛的方法是创建和使用速度缓存,这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小.
我们使用类似上述第一种方法实现来模拟运动模糊的效果,我们不需要在一帧中把场景渲染多次,但需要保存之间的渲染结果,不断把当前的渲染图像叠加到之前的渲染图像中,从而产生一种运动轨迹的视觉效果,这样方法性能更好,但模糊效果可能会略差.
脚本实现:
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