using UnityEngine; public class RippleImageEffect : MonoBehaviour { public enum Quality { High = 2, Medium = 3, Low = 4, VeryLow = 6 } public Quality quality = Quality.High; [Range(0f, 4f)] public float intensity = 2.5f; [Range(0f, 0.09f)] public float damping; [Range(0.5f, 2f)] public float size = 1f; private Material mtrl; private RenderTexture bufferA; private RenderTexture bufferACache; private RenderTexture bufferB; private RenderTexture bufferBCache; private int frameCount; private void Awake() { mtrl = new Material(Shader.Find("Hidden/RippleImageEffect")); } private void OnRenderImage(RenderTexture src, RenderTexture dest) { if (mtrl == null || mtrl.shader == null || !mtrl.shader.isSupported) { base.enabled = false; return; } int num = (int)quality; int num2 = Screen.width / num; int num3 = Screen.height / num; if (bufferA == null || bufferA.width != num2 || bufferA.height != num3) { DestroyBufferA(); bufferA = new RenderTexture(num2, num3, 0, RenderTextureFormat.Default); } if (bufferACache == null || bufferACache.width != num2 || bufferACache.height != num3) { DestroyBufferACache(); bufferACache = new RenderTexture(num2, num3, 0, RenderTextureFormat.Default); } if (bufferB == null || bufferB.width != num2 || bufferB.height != num3) { DestroyBufferA(); bufferB = new RenderTexture(num2, num3, 0, RenderTextureFormat.Default); } if (bufferBCache == null || bufferBCache.width != num2 || bufferBCache.height != num3) { bufferBCache = new RenderTexture(num2, num3, 0, RenderTextureFormat.Default); } if (bufferA == null || bufferB == null || bufferACache == null || bufferBCache == null) { Graphics.Blit(src, dest); return; } Vector4 zero = Vector4.zero; zero.z = (Input.GetMouseButton(0) ? 1 : 0); zero.x = Input.mousePosition.x; zero.y = Input.mousePosition.y; zero.w = frameCount; mtrl.SetVector("mouseData", zero); mtrl.SetFloat("intensity", intensity); mtrl.SetFloat("damping", damping); mtrl.SetFloat("size", size); mtrl.SetTexture("bufferA", bufferA); mtrl.SetTexture("bufferB", bufferB); Graphics.Blit(src, bufferACache, mtrl, 0); Graphics.Blit(bufferACache, bufferA); mtrl.SetTexture("bufferA", bufferB); mtrl.SetTexture("bufferB", bufferA); Graphics.Blit(src, bufferBCache, mtrl, 0); Graphics.Blit(bufferBCache, bufferB); mtrl.SetTexture("bufferA", bufferA); mtrl.SetTexture("bufferB", bufferB); Graphics.Blit(src, dest, mtrl, 1); frameCount++; } private void OnDestroy() { if (mtrl != null) { Object.Destroy(mtrl); mtrl = null; } DestroyBufferA(); DestroyBufferB(); DestroyBufferACache(); DestroyBufferBCache(); } private void DestroyBufferA() { if (bufferA != null) { Object.Destroy(bufferA); bufferA = null; } } private void DestroyBufferACache() { if (bufferACache != null) { Object.Destroy(bufferACache); bufferACache = null; } } private void DestroyBufferB() { if (bufferB != null) { Object.Destroy(bufferB); bufferB = null; } } private void DestroyBufferBCache() { if (bufferBCache != null) { Object.Destroy(bufferBCache); bufferBCache = null; } } }