ContrastEnhance.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using UnityEngine;
  3. namespace UnityStandardAssets.ImageEffects
  4. {
  5. [ExecuteInEditMode]
  6. [RequireComponent(typeof(Camera))]
  7. [AddComponentMenu("Image Effects/Color Adjustments/Contrast Enhance (Unsharp Mask)")]
  8. public class ContrastEnhance : PostEffectsBase
  9. {
  10. [Range(0.0f, 1.0f)]
  11. public float intensity = 0.5f;
  12. [Range(0.0f,0.999f)]
  13. public float threshold = 0.0f;
  14. private Material separableBlurMaterial;
  15. private Material contrastCompositeMaterial;
  16. [Range(0.0f,1.0f)]
  17. public float blurSpread = 1.0f;
  18. public Shader separableBlurShader = null;
  19. public Shader contrastCompositeShader = null;
  20. public override bool CheckResources ()
  21. {
  22. CheckSupport (false);
  23. contrastCompositeMaterial = CheckShaderAndCreateMaterial (contrastCompositeShader, contrastCompositeMaterial);
  24. separableBlurMaterial = CheckShaderAndCreateMaterial (separableBlurShader, separableBlurMaterial);
  25. if (!isSupported)
  26. ReportAutoDisable ();
  27. return isSupported;
  28. }
  29. void OnRenderImage (RenderTexture source, RenderTexture destination)
  30. {
  31. if (CheckResources()==false)
  32. {
  33. Graphics.Blit (source, destination);
  34. return;
  35. }
  36. int rtW = source.width;
  37. int rtH = source.height;
  38. RenderTexture color2 = RenderTexture.GetTemporary (rtW/2, rtH/2, 0);
  39. // downsample
  40. Graphics.Blit (source, color2);
  41. RenderTexture color4a = RenderTexture.GetTemporary (rtW/4, rtH/4, 0);
  42. Graphics.Blit (color2, color4a);
  43. RenderTexture.ReleaseTemporary (color2);
  44. // blur
  45. separableBlurMaterial.SetVector ("offsets", new Vector4 (0.0f, (blurSpread * 1.0f) / color4a.height, 0.0f, 0.0f));
  46. RenderTexture color4b = RenderTexture.GetTemporary (rtW/4, rtH/4, 0);
  47. Graphics.Blit (color4a, color4b, separableBlurMaterial);
  48. RenderTexture.ReleaseTemporary (color4a);
  49. separableBlurMaterial.SetVector ("offsets", new Vector4 ((blurSpread * 1.0f) / color4a.width, 0.0f, 0.0f, 0.0f));
  50. color4a = RenderTexture.GetTemporary (rtW/4, rtH/4, 0);
  51. Graphics.Blit (color4b, color4a, separableBlurMaterial);
  52. RenderTexture.ReleaseTemporary (color4b);
  53. // composite
  54. contrastCompositeMaterial.SetTexture ("_MainTexBlurred", color4a);
  55. contrastCompositeMaterial.SetFloat ("intensity", intensity);
  56. contrastCompositeMaterial.SetFloat ("threshold", threshold);
  57. Graphics.Blit (source, destination, contrastCompositeMaterial);
  58. RenderTexture.ReleaseTemporary (color4a);
  59. }
  60. }
  61. }