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);
 | 
						|
    }
 | 
						|
} |