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

132 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Thousandto.Launcher.ExternalLibs;
using UnityEngine;
namespace UnityStandardAssets.ImageEffects
{
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
[AddComponentMenu("Image Effects/DistortEffect/DistortEffect(Optimized)")]
public class DistortEffect : PostEffectsBase
{
[Range(0.0f, 1.0f)]
public float DistortTimeFactor = 0.15f;
//扭曲的强度
[Range(0.0f, 0.2f)]
public float DistortStrength = 0.01f;
//噪声图
public Texture NoiseTexture = null;
//降采样系数
public int downSample = 2;
public LayerMask _Cameralayer = 1 << 28;
private Camera mainCam = null;
private Camera additionalCam = null;
private RenderTexture renderTexture = null;
private Material _Material = null;
private Shader _Shader = null;
//渲染Mask图所用的shader
private Shader maskObjShader = null;
public void OnRenderImage(RenderTexture source, RenderTexture destination)
{
//分辨率可以低一些
if (renderTexture == null)
renderTexture = RenderTexture.GetTemporary(source.width, source.height, 0);
renderTexture.name = "RenderTexture59";
renderTexture.antiAliasing = 1;
if (_Material)
{
_Material.SetTexture("_NoiseTex", NoiseTexture);
_Material.SetFloat("_DistortTimeFactor", DistortTimeFactor);
_Material.SetFloat("_DistortStrength", DistortStrength);
_Material.SetTexture("_MaskTex", renderTexture);
Graphics.Blit(source, destination, _Material);
}
else
{
Graphics.Blit(source, destination);
}
}
public override bool CheckResources()
{
CheckSupport(false);
_Shader = ShaderFactory.Find("Ares/DistortEffect/DistortEffect");
maskObjShader = ShaderFactory.Find("Ares/DistortEffect/DistortEffectMask");
_Material = CheckShaderAndCreateMaterial(_Shader, _Material);
if (!isSupported)
ReportAutoDisable();
return isSupported;
}
void Awake()
{
//创建一个和当前相机一致的相机
InitAdditionalCam();
}
private void InitAdditionalCam()
{
mainCam = GetComponent<Camera>();
if (mainCam == null)
return;
Transform addCamTransform = mainCam.transform.Find("additionalDistortCam");
if (addCamTransform != null)
DestroyImmediate(addCamTransform.gameObject);
GameObject additionalCamObj = new GameObject("additionalDistortCam");
additionalCam = additionalCamObj.AddComponent<Camera>();
SetAdditionalCam();
}
private void SetAdditionalCam()
{
if (additionalCam)
{
additionalCam.transform.parent = mainCam.transform;
additionalCam.transform.localPosition = Vector3.zero;
additionalCam.transform.localRotation = Quaternion.identity;
additionalCam.transform.localScale = Vector3.one;
additionalCam.farClipPlane = mainCam.farClipPlane;
additionalCam.nearClipPlane = mainCam.nearClipPlane;
additionalCam.fieldOfView = mainCam.fieldOfView;
additionalCam.backgroundColor = Color.clear;
additionalCam.clearFlags = CameraClearFlags.Color;
additionalCam.cullingMask = _Cameralayer;
additionalCam.depth = -999;
}
}
void OnEnable()
{
SetAdditionalCam();
additionalCam.enabled = true;
}
void OnDisable()
{
additionalCam.enabled = false;
}
void OnDestroy()
{
if (renderTexture)
{
RenderTexture.ReleaseTemporary(renderTexture);
}
DestroyImmediate(additionalCam.gameObject);
}
//在真正渲染前的回调此处渲染Mask遮罩图
void OnPreRender()
{
//maskObjShader进行渲染
if (additionalCam.enabled)
{
additionalCam.targetTexture = renderTexture;
additionalCam.RenderWithShader(maskObjShader, "");
}
}
}
}