summaryrefslogtreecommitdiff
path: root/Client/Assets/Scripts/PostEffect/FastBloom.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-01-25 14:28:30 +0800
committerchai <chaifix@163.com>2021-01-25 14:28:30 +0800
commit6eb915c129fc90c6f4c82ae097dd6ffad5239efc (patch)
tree7dd2be50edf41f36b60fac84696e731c13afe617 /Client/Assets/Scripts/PostEffect/FastBloom.cs
+scripts
Diffstat (limited to 'Client/Assets/Scripts/PostEffect/FastBloom.cs')
-rw-r--r--Client/Assets/Scripts/PostEffect/FastBloom.cs98
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);
+ }
+}