147 lines
3.2 KiB
C#
147 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|