DirtyLensFlare.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using UnityEngine;
  2. using System.Collections;
  3. public enum LensFlareTypes {
  4. BloomAndFlare = 0,
  5. Flare = 2,
  6. Bloom = 1
  7. }
  8. [RequireComponent (typeof(Camera))]
  9. [ExecuteInEditMode]
  10. [AddComponentMenu("Image Effects/Max P/Dirty Lens Flare")]
  11. public class DirtyLensFlare : MonoBehaviour {
  12. // Flare Settings
  13. public LensFlareTypes lensFlareType;
  14. public float saturation = 0.9f;
  15. public float threshold = 0.5f;
  16. public float flareIntensity = 2.5f;
  17. public float bloomIntensity = 2.0f;
  18. // Blur
  19. public int iterations = 10;
  20. public float blurSpread = 0.6f;
  21. // Downsample
  22. public int downsample = 6;
  23. // Textures
  24. public bool useDirt = true;
  25. public Texture2D screenDirt;
  26. // Shaders and Materials
  27. private Shader blurShader;
  28. private Material blurMaterial;
  29. // ------------------------------------------------------------------------------
  30. // Image Effect Base (Default Unity Image Effect Script: Standard Assets/Image Effects (Pro Only)/ImageEffectBase.cs)
  31. // ------------------------------------------------------------------------------
  32. #region Image Effect Base
  33. private Shader shader;
  34. private Material m_Material;
  35. // (Modified)
  36. protected virtual void Start ()
  37. {
  38. // Check Resources First
  39. CheckResources();
  40. // Disable if we don't support image effects
  41. if (!SystemInfo.supportsImageEffects) {
  42. enabled = false;
  43. return;
  44. }
  45. // Disable the image effect if the shader can't
  46. // run on the users graphics card
  47. if (!shader || !shader.isSupported)
  48. enabled = false;
  49. }
  50. protected Material material {
  51. get {
  52. if (m_Material == null) {
  53. m_Material = new Material (shader);
  54. m_Material.hideFlags = HideFlags.HideAndDontSave;
  55. }
  56. return m_Material;
  57. }
  58. }
  59. protected virtual void OnDisable() {
  60. if( m_Material ) {
  61. DestroyImmediate( m_Material );
  62. }
  63. }
  64. #endregion
  65. // ------------------------------------------------------------------------------
  66. // Blur (Default Unity Blur Shader Script: Standard Assets/Image Effects (Pro Only)/BlurEffect.cs)
  67. // ------------------------------------------------------------------------------
  68. #region Blur Shader Script
  69. // Performs one blur iteration.
  70. public void FourTapCone (RenderTexture source, RenderTexture dest, int iteration, Material blurMtl)
  71. {
  72. float off = 0.5f + iteration*blurSpread;
  73. Graphics.BlitMultiTap (source, dest, blurMtl,
  74. new Vector2(-off, -off),
  75. new Vector2(-off, off),
  76. new Vector2( off, off),
  77. new Vector2( off, -off)
  78. );
  79. }
  80. // Applies a blur effect (Modified from default script)
  81. void ApplyBlurPass(RenderTexture source, RenderTexture destination, Material blurMtl)
  82. {
  83. downsample = Mathf.Clamp(downsample, 1, 12);
  84. RenderTexture buffer = RenderTexture.GetTemporary(source.width / downsample, source.height / downsample, 0);
  85. RenderTexture buffer2 = RenderTexture.GetTemporary(source.width / downsample, source.height / downsample, 0);
  86. // Copy source into buffer
  87. Graphics.Blit(source, buffer);
  88. // Blur the small texture
  89. bool oddEven = true;
  90. for(int i = 0; i < iterations; i++)
  91. {
  92. if( oddEven )
  93. FourTapCone (buffer, buffer2, i, blurMtl);
  94. else
  95. FourTapCone (buffer2, buffer, i, blurMtl);
  96. oddEven = !oddEven;
  97. }
  98. if( oddEven )
  99. Graphics.Blit(buffer, destination);
  100. else
  101. Graphics.Blit(buffer2, destination);
  102. // Release the buffers
  103. RenderTexture.ReleaseTemporary(buffer);
  104. RenderTexture.ReleaseTemporary(buffer2);
  105. }
  106. #endregion
  107. // ------------------------------------------------------------------------------
  108. // Dirty Lens Flare MAIN
  109. // ------------------------------------------------------------------------------
  110. #region Dirty Lens Flare
  111. bool CheckResources()
  112. {
  113. // Check blur shader
  114. if(!blurShader)
  115. {
  116. blurShader = Shader.Find("Hidden/Dirty Lens Flare Blur");
  117. if(!blurShader)
  118. return false;
  119. }
  120. // Check blur material
  121. if(!blurMaterial)
  122. {
  123. blurMaterial = new Material(blurShader);
  124. blurMaterial.hideFlags = HideFlags.HideAndDontSave;
  125. if(!blurMaterial)
  126. return false;
  127. }
  128. // Check dirty lens flare shader
  129. if(!shader)
  130. {
  131. shader = Shader.Find("Hidden/Dirty Lens Flare");
  132. if(!shader)
  133. return false;
  134. }
  135. return true;
  136. }
  137. // Called by camera to apply image effect
  138. void OnRenderImage (RenderTexture source, RenderTexture destination) {
  139. if( CheckResources() )
  140. {
  141. material.SetFloat("_Threshold", threshold);
  142. material.SetFloat("_Scale", flareIntensity);
  143. material.SetFloat("_BloomScale", bloomIntensity);
  144. // Create downsampled image
  145. RenderTexture downSampled = RenderTexture.GetTemporary (source.width / 4, source.height / 4, 0, RenderTextureFormat.Default);
  146. // Apply threshold
  147. material.SetFloat("_desaturate", 1.0f-saturation);
  148. switch(lensFlareType)
  149. {
  150. case LensFlareTypes.Bloom:
  151. Graphics.Blit(source, downSampled, material, 2); // Bloom only
  152. break;
  153. case LensFlareTypes.Flare:
  154. Graphics.Blit(source, downSampled, material, 0); // Flare only
  155. break;
  156. case LensFlareTypes.BloomAndFlare:
  157. Graphics.Blit(source, downSampled, material, 1); // Flare + Bloom
  158. break;
  159. }
  160. // Create blur buffer
  161. RenderTexture blurred = RenderTexture.GetTemporary (downSampled.width, downSampled.height, 0, RenderTextureFormat.Default);
  162. // Apply blur
  163. ApplyBlurPass(downSampled, blurred, blurMaterial);
  164. // Apply blending
  165. material.SetTexture("_Flare", blurred);
  166. if( useDirt )
  167. {
  168. material.SetTexture("_Dirt", screenDirt);
  169. Graphics.Blit (source, destination, material, 3);
  170. }
  171. else
  172. {
  173. Graphics.Blit (source, destination, material, 4);
  174. }
  175. // Release downsampled images
  176. RenderTexture.ReleaseTemporary (downSampled);
  177. RenderTexture.ReleaseTemporary (blurred);
  178. }
  179. }
  180. #endregion
  181. }