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(); if (mainCam == null) return; Transform addCamTransform = mainCam.transform.Find("additionalDistortCam"); if (addCamTransform != null) DestroyImmediate(addCamTransform.gameObject); GameObject additionalCamObj = new GameObject("additionalDistortCam"); additionalCam = additionalCamObj.AddComponent(); 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, ""); } } } }