diff options
author | chai <chaifix@163.com> | 2021-01-25 14:28:30 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-01-25 14:28:30 +0800 |
commit | 6eb915c129fc90c6f4c82ae097dd6ffad5239efc (patch) | |
tree | 7dd2be50edf41f36b60fac84696e731c13afe617 /Client/Assets/Scripts/PostEffect/FastBloom.cs |
+scripts
Diffstat (limited to 'Client/Assets/Scripts/PostEffect/FastBloom.cs')
-rw-r--r-- | Client/Assets/Scripts/PostEffect/FastBloom.cs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Client/Assets/Scripts/PostEffect/FastBloom.cs b/Client/Assets/Scripts/PostEffect/FastBloom.cs new file mode 100644 index 00000000..dc1fc745 --- /dev/null +++ b/Client/Assets/Scripts/PostEffect/FastBloom.cs @@ -0,0 +1,98 @@ +using UnityEngine;
+using System.Collections;
+
+[ExecuteInEditMode]
+[RequireComponent(typeof(Camera))]
+public class FastBloom : PostEffectsBase
+{
+ public enum Resolution {
+ Low = 0,
+ High = 1,
+ }
+
+ public enum BlurType {
+ Standard = 0,
+ Sgx = 1,
+ }
+
+ [Range(0.0f, 1.5f)]
+ public float threshhold = 0.25f;
+ [Range(0.0f, 2.5f)]
+ public float intensity = 0.75f;
+
+ [Range(0.25f, 5.5f)]
+ public float blurSize = 1.0f;
+
+ Resolution resolution = Resolution.Low;
+ [Range(1, 4)]
+ public int blurIterations = 1;
+
+ public BlurType blurType = BlurType.Standard;
+
+ public Shader fastBloomShader;
+ private Material fastBloomMaterial = null;
+
+ new bool CheckResources ()
+ {
+ CheckSupport (false);
+
+ fastBloomMaterial = CheckShaderAndCreateMaterial (fastBloomShader, fastBloomMaterial);
+
+ if(!isSupported)
+ ReportAutoDisable ();
+ return isSupported;
+ }
+
+ void OnDisable() {
+ if(fastBloomMaterial)
+ DestroyImmediate (fastBloomMaterial);
+ }
+
+ void OnRenderImage (RenderTexture source, RenderTexture destination)
+ {
+ if(CheckResources() == false) {
+ Graphics.Blit (source, destination);
+ return;
+ }
+
+ int divider = resolution == Resolution.Low ? 4 : 2;
+ float widthMod = resolution == Resolution.Low ? 0.5f : 1.0f;
+
+ fastBloomMaterial.SetVector ("_Parameter",new Vector4 (blurSize * widthMod, 0.0f, threshhold, intensity));
+ source.filterMode = FilterMode.Bilinear;
+
+ var rtW = source.width/divider;
+ var rtH = source.height/divider;
+
+ // downsample
+ RenderTexture rt = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
+ rt.filterMode = FilterMode.Bilinear;
+ Graphics.Blit (source, rt, fastBloomMaterial, 1);
+
+ int passOffs = blurType == BlurType.Standard ? 0 : 2;
+
+ for(int i = 0; i < blurIterations; i++) {
+ fastBloomMaterial.SetVector("_Parameter", new Vector4(blurSize * widthMod + (i * 1.0f), 0.0f, threshhold, intensity));
+
+ // vertical blur
+ RenderTexture rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
+ rt2.filterMode = FilterMode.Bilinear;
+ Graphics.Blit (rt, rt2, fastBloomMaterial, 2 + passOffs);
+ RenderTexture.ReleaseTemporary (rt);
+ rt = rt2;
+
+ // horizontal blur
+ rt2 = RenderTexture.GetTemporary (rtW, rtH, 0, source.format);
+ rt2.filterMode = FilterMode.Bilinear;
+ Graphics.Blit (rt, rt2, fastBloomMaterial, 3 + passOffs);
+ RenderTexture.ReleaseTemporary (rt);
+ rt = rt2;
+ }
+
+ fastBloomMaterial.SetTexture ("_Bloom", rt);
+
+ Graphics.Blit (source, destination, fastBloomMaterial, 0);
+
+ RenderTexture.ReleaseTemporary (rt);
+ }
+}
|