Files
UltimateFishing2020/Assets/Scripts/Assembly-CSharp/RippleImageEffect.cs
2026-03-04 10:03:45 +08:00

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;
}
}
}