Files
Main/Assets/Launcher/ExternalLibs/CmdBuffer/DistortEffect/DistortEffectSimpleScript.cs
2025-01-25 04:38:09 +08:00

152 lines
4.2 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
namespace Thousandto.Launcher.ExternalLibs
{
/// <summary>
/// 一个简单的扭曲效果脚本
/// </summary>
[RequireComponent(typeof(Camera))]
public class DistortEffectSimpleScript: MonoBehaviour
{
//触发事件
private const CameraEvent CN_TRIGGER_EVENT = CameraEvent.BeforeImageEffects;
[Range(0.0f, 1.0f)]
public float DistortTimeFactor = 0.15f;
//扭曲的强度
[Range(0.0f, 0.2f)]
public float DistortStrength = 0.01f;
//噪声图
public Texture NoiseTexture = null;
private Camera _camera;
private CommandBuffer _cmd;
private Material _mat;
private void Start()
{
InitCamera();
InitMat();
InitCmd();
}
private void OnEnable()
{
if (_cmd != null && _camera != null)
{
_camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
RefreshMat();
}
private void OnDisable()
{
if (_cmd != null && _camera != null)
{
_camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
}
private void OnDestroy()
{
if (_cmd != null)
{
if (_camera != null)
{
_camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
_cmd.Release();
_cmd = null;
}
if (_mat != null)
{
GameObject.Destroy(_mat);
_mat = null;
}
}
private void OnValidate()
{
RefreshMat();
}
private void InitCamera()
{
_camera = GetComponent<Camera>();
_camera.forceIntoRenderTexture = true;
}
private void InitCmd()
{
if (_cmd == null)
{
_cmd = new CommandBuffer();
_cmd.name = "DistortEffect";
var _tmpTexID = Shader.PropertyToID("_TmpTex");
_cmd.GetTemporaryRT(_tmpTexID, -1, -1,0,FilterMode.Bilinear);
_cmd.SetRenderTarget(_tmpTexID);
_cmd.SetGlobalTexture(CmdBufferUtils.MainTexID, BuiltinRenderTextureType.CameraTarget);
_cmd.DrawMesh(CmdBufferUtils.QuadMesh, Matrix4x4.identity, CmdBufferUtils.BlitMat, 0, 0);
_cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget);
_cmd.SetGlobalTexture(CmdBufferUtils.MainTexID, _tmpTexID);
_cmd.DrawMesh(CmdBufferUtils.QuadMesh, Matrix4x4.identity, _mat,0,0);
_cmd.ReleaseTemporaryRT(_tmpTexID);
if (_camera != null)
{
_camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
}
}
private void InitMat()
{
var sh = RuntimeUtilities.FindShader("Hidden/Ares/PostEffect/DistortEffect");
if (sh != null)
{
_mat = new Material(sh);
_mat.hideFlags = HideFlags.DontSave;
RefreshMat();
}
else
{
Debug.LogError("没有找到Shader:Hidden/Ares/PostEffect/DistortEffect");
}
}
private void RefreshMat()
{
if (_mat != null)
{
_mat.SetVector("_Params", new Vector4(DistortTimeFactor, DistortStrength, 0, 0));
_mat.SetTexture("_NoiseTex", NoiseTexture);
}
}
private void OnPostEffectActive(int val)
{
if (_camera != null && _cmd != null)
{
//根据激活状态来处理
if (val > 0)
{
_camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd);
_camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
else
{
_camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd);
}
}
}
}
}