123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- using System;
- using UnityEngine;
- /**
- * 在 UnityStandardAssets 的模糊效果上做了魔改
- * 1. BlurType 只保留标准高斯
- * 2. 修改 MobileBlur.shader 增加圆形裁剪
- */
- namespace UnityStandardAssets.ImageEffects
- {
- [ExecuteInEditMode]
- [RequireComponent (typeof(Camera))]
- [AddComponentMenu ("Image Effects/Blur/Blur (Optimized)")]
- public class BlurOptimized : PostEffectsBase
- {
- [Range(0, 2)]
- public int downsample = 1;
- public enum BlurType {
- StandardGauss = 0,
- SgxGauss = 1,
- }
- [Range(0.0f, 10.0f)]
- public float blurSize = 3.0f;
- [Range(1, 4)]
- public int blurIterations = 2;
- public float darken = 0;
- public Vector3 clipCircle = new Vector3(0.5f, 0.5f, 0.2f);
- private BlurType blurType = BlurType.StandardGauss;
- public Shader blurShader = null;
- private Material blurMaterial = null;
- public override bool CheckResources () {
- CheckSupport (false);
- blurMaterial = CheckShaderAndCreateMaterial (blurShader, blurMaterial);
- if (!isSupported)
- ReportAutoDisable ();
- return isSupported;
- }
- public void OnDisable () {
- if (blurMaterial)
- DestroyImmediate (blurMaterial);
- }
- public void OnRenderImage (RenderTexture source, RenderTexture destination) {
- if (CheckResources() == false) {
- Graphics.Blit (source, destination);
- return;
- }
- float widthMod = 1.0f / (1.0f * (1<<downsample));
- blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod, -blurSize * widthMod, 0.0f, 0.0f));
- source.filterMode = FilterMode.Bilinear;
- int rtW = source.width >> downsample;
- int rtH = source.height >> downsample;
- // downsample
- RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
- rt.filterMode = FilterMode.Bilinear;
- Graphics.Blit (source, rt, blurMaterial, 0);
- var passOffs= blurType == BlurType.StandardGauss ? 0 : 2;
- for(int i = 0; i < blurIterations; i++) {
- float iterationOffs = (i*1.0f);
- blurMaterial.SetVector ("_Parameter", new Vector4 (blurSize * widthMod + iterationOffs, -blurSize * widthMod - iterationOffs, 0.0f, 0.0f));
- // vertical blur
- RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
- rt2.filterMode = FilterMode.Bilinear;
- Graphics.Blit (rt, rt2, blurMaterial, 1 + passOffs);
- RenderTexture.ReleaseTemporary (rt);
- rt = rt2;
- // horizontal blur
- rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
- rt2.filterMode = FilterMode.Bilinear;
- Graphics.Blit (rt, rt2, blurMaterial, 2 + passOffs);
- RenderTexture.ReleaseTemporary (rt);
- rt = rt2;
- }
- // compose
- blurMaterial.SetVector("_Clip", clipCircle);
- blurMaterial.SetFloat("_Darken", darken);
- blurMaterial.SetTexture("_SourceTex", source);
- Graphics.Blit (rt, destination, blurMaterial, 5);
- RenderTexture.ReleaseTemporary (rt);
- }
- }
- }
|