152 lines
4.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|