| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | using UnityEngine;using System.Collections;public enum LensFlareTypes {     BloomAndFlare = 0,	Flare = 2,	Bloom = 1}[RequireComponent (typeof(Camera))][ExecuteInEditMode][AddComponentMenu("Image Effects/Max P/Dirty Lens Flare")]public class DirtyLensFlare : MonoBehaviour {		// Flare Settings	public LensFlareTypes lensFlareType;	public float saturation     = 0.9f;	public float threshold      = 0.5f;	public float flareIntensity = 2.5f;	public float bloomIntensity = 2.0f;		// Blur	public int   iterations = 10;	public float blurSpread = 0.6f;		// Downsample	public int   downsample = 6;		// Textures	public bool      useDirt = true;	public Texture2D screenDirt;		// Shaders and Materials	private Shader   blurShader;	private Material blurMaterial;		// ------------------------------------------------------------------------------	//  Image Effect Base (Default Unity Image Effect Script: Standard Assets/Image Effects (Pro Only)/ImageEffectBase.cs)	// ------------------------------------------------------------------------------	#region Image Effect Base	private Shader   shader;	private Material m_Material;		// (Modified)	protected virtual void Start ()	{		// Check Resources First		CheckResources();				// Disable if we don't support image effects		if (!SystemInfo.supportsImageEffects) {			enabled = false;			return;		}				// Disable the image effect if the shader can't		// run on the users graphics card		if (!shader || !shader.isSupported)			enabled = false;	}		protected Material material {		get {			if (m_Material == null) {				m_Material = new Material (shader);				m_Material.hideFlags = HideFlags.HideAndDontSave;			}			return m_Material;		} 	}		protected virtual void OnDisable() {		if( m_Material ) {			DestroyImmediate( m_Material );		}	}	#endregion			// ------------------------------------------------------------------------------	//  Blur (Default Unity Blur Shader Script: Standard Assets/Image Effects (Pro Only)/BlurEffect.cs)	// ------------------------------------------------------------------------------	#region Blur Shader Script	// Performs one blur iteration.	public void FourTapCone (RenderTexture source, RenderTexture dest, int iteration, Material blurMtl)	{		float off = 0.5f + iteration*blurSpread;		Graphics.BlitMultiTap (source, dest, blurMtl,			new Vector2(-off, -off),			new Vector2(-off,  off),			new Vector2( off,  off),			new Vector2( off, -off)		);	}		// Applies a blur effect (Modified from default script)	void ApplyBlurPass(RenderTexture source, RenderTexture destination, Material blurMtl)	{				downsample = Mathf.Clamp(downsample, 1, 12);				RenderTexture buffer  = RenderTexture.GetTemporary(source.width / downsample, source.height / downsample, 0);		RenderTexture buffer2 = RenderTexture.GetTemporary(source.width / downsample, source.height / downsample, 0);				// Copy source into buffer		Graphics.Blit(source, buffer);				// Blur the small texture		bool oddEven = true;		for(int i = 0; i < iterations; i++)		{			if( oddEven )				FourTapCone (buffer, buffer2, i, blurMtl);			else				FourTapCone (buffer2, buffer, i, blurMtl);			oddEven = !oddEven;		}		if( oddEven )			Graphics.Blit(buffer, destination);		else			Graphics.Blit(buffer2, destination);				// Release the buffers		RenderTexture.ReleaseTemporary(buffer);		RenderTexture.ReleaseTemporary(buffer2);	}	#endregion		// ------------------------------------------------------------------------------	//  Dirty Lens Flare MAIN	// ------------------------------------------------------------------------------	#region Dirty Lens Flare		bool CheckResources()	{		// Check blur shader		if(!blurShader)		{			blurShader = Shader.Find("Hidden/Dirty Lens Flare Blur");			if(!blurShader)				return false;		}				// Check blur material		if(!blurMaterial)		{			blurMaterial = new Material(blurShader);			blurMaterial.hideFlags = HideFlags.HideAndDontSave;			if(!blurMaterial)				return false;		}				// Check dirty lens flare shader		if(!shader)		{			shader = Shader.Find("Hidden/Dirty Lens Flare");			if(!shader)				return false;		}				return true;	}		// Called by camera to apply image effect	void OnRenderImage (RenderTexture source, RenderTexture destination) {				if( CheckResources() )		{						material.SetFloat("_Threshold",  threshold);			material.SetFloat("_Scale",      flareIntensity);			material.SetFloat("_BloomScale", bloomIntensity);						// Create downsampled image			RenderTexture downSampled = RenderTexture.GetTemporary (source.width / 4, source.height / 4, 0, RenderTextureFormat.Default);						// Apply threshold			material.SetFloat("_desaturate", 1.0f-saturation);			switch(lensFlareType)			{			case LensFlareTypes.Bloom:				Graphics.Blit(source, downSampled, material, 2); // Bloom only				break;			case LensFlareTypes.Flare:				Graphics.Blit(source, downSampled, material, 0); // Flare only				break;			case LensFlareTypes.BloomAndFlare:				Graphics.Blit(source, downSampled, material, 1); // Flare + Bloom				break;			}						// Create blur buffer			RenderTexture blurred = RenderTexture.GetTemporary (downSampled.width, downSampled.height, 0, RenderTextureFormat.Default);							// Apply blur			ApplyBlurPass(downSampled, blurred, blurMaterial);						// Apply blending			material.SetTexture("_Flare", blurred);			if( useDirt )			{				material.SetTexture("_Dirt", screenDirt);				Graphics.Blit (source, destination, material, 3);			}			else			{				Graphics.Blit (source, destination, material, 4);			}						// Release downsampled images			RenderTexture.ReleaseTemporary (downSampled);			RenderTexture.ReleaseTemporary (blurred);					}			}	#endregion	}
 |