54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
// This class implements simple ghosting type Motion Blur.
|
|
// If Extra Blur is selected, the scene will allways be a little blurred,
|
|
// as it is scaled to a smaller resolution.
|
|
// The effect works by accumulating the previous frames in an accumulation
|
|
// texture.
|
|
[AddComponentMenu("Image Effects/Motion Blur")]
|
|
public class MotionBlur : ImageEffectBase
|
|
{
|
|
public float blurAmount = 0.8f;
|
|
public bool extraBlur = false;
|
|
|
|
private RenderTexture accumTexture;
|
|
|
|
protected new void OnDisable()
|
|
{
|
|
base.OnDisable();
|
|
DestroyImmediate(accumTexture);
|
|
}
|
|
|
|
// Called by camera to apply image effect
|
|
void OnRenderImage(RenderTexture source, RenderTexture destination)
|
|
{
|
|
// Create the accumulation texture
|
|
if (accumTexture == null || accumTexture.width != source.width || accumTexture.height != source.height)
|
|
{
|
|
DestroyImmediate(accumTexture);
|
|
accumTexture = new RenderTexture(source.width, source.height, 0);
|
|
accumTexture.hideFlags = HideFlags.HideAndDontSave;
|
|
ImageEffects.Blit(source, accumTexture);
|
|
}
|
|
|
|
// If Extra Blur is selected, downscale the texture to 4x4 smaller resolution.
|
|
if (extraBlur)
|
|
{
|
|
RenderTexture blurbuffer = RenderTexture.GetTemporary(source.width / 4, source.height / 4, 0);
|
|
ImageEffects.Blit(accumTexture, blurbuffer);
|
|
ImageEffects.Blit(blurbuffer, accumTexture);
|
|
RenderTexture.ReleaseTemporary(blurbuffer);
|
|
}
|
|
|
|
// Clamp the motion blur variable, so it can never leave permanent trails in the image
|
|
blurAmount = Mathf.Clamp(blurAmount, 0.0f, 0.92f);
|
|
|
|
// Setup the texture and floating point values in the shader
|
|
material.SetTexture("_MainTex", accumTexture);
|
|
material.SetFloat("_AccumOrig", 1.0F - blurAmount);
|
|
|
|
// Render the image using the motion blur shader
|
|
Graphics.Blit(source, accumTexture, material);
|
|
Graphics.Blit(accumTexture, destination);
|
|
}
|
|
} |