using UnityEngine; using System.Collections; [RequireComponent(typeof(Camera))] public class ShowSelection : MonoBehaviour { private Camera myCamera; public int Iterations = 3; public float Spread = 0.7f; public Color OutLineColor = new Color(0.133f, 1, 0, 1); public Camera outterLineCamera; public Shader compositeShader; Material m_CompositeMaterial = null; private int originPixelWidth; private int originPixelHeight; protected Material compositeMaterial { get { if (m_CompositeMaterial == null) { m_CompositeMaterial = new Material(compositeShader); m_CompositeMaterial.hideFlags = HideFlags.HideAndDontSave; } return m_CompositeMaterial; } } public Shader blurShader; Material m_BlurMaterial = null; protected Material blurMaterial { get { if (m_BlurMaterial == null) { m_BlurMaterial = new Material(blurShader); m_BlurMaterial.hideFlags = HideFlags.HideAndDontSave; } return m_BlurMaterial; } } public Shader cutoffShader; Material m_cutoffMaterial = null; protected Material cutoffMaterial { get { if (m_cutoffMaterial == null) { m_cutoffMaterial = new Material(cutoffShader); m_cutoffMaterial.hideFlags = HideFlags.HideAndDontSave; } return m_cutoffMaterial; } } private Material m_outterLineMat = null; public Shader HighLightedShader; protected Material outterLineMat { get { if (m_outterLineMat == null) { //m_outterLineMat = new Material("Shader\"Hidden/SolidBody1\"{SubShader{Pass{Color(" + // outterColor.r + "," + outterColor.g + "," + outterColor.b + "," + outterColor.a + ")}}}"); Shader.SetGlobalColor("highLightColor",OutLineColor); m_outterLineMat = new Material(HighLightedShader); m_outterLineMat.hideFlags = HideFlags.HideAndDontSave; //m_outterLineMat.shader.hideFlags = HideFlags.HideAndDontSave; } return m_outterLineMat; } } private RenderTexture outterLineTexture = null; void Start() { if (!SystemInfo.supportsImageEffects) {//判断显卡是否支持图形后处理效果 enabled = false; return; } if (!blurMaterial.shader.isSupported)//判断显卡是否支持此shader enabled = false; if (!compositeMaterial.shader.isSupported)//判断显卡是否支持此shader enabled = false; if (!cutoffMaterial.shader.isSupported)//判断显卡是否支持此shader enabled = false; if (!outterLineMat.shader.isSupported)//判断显卡是否支持此shader enabled = false; myCamera = GetComponent(); if (!outterLineTexture) { outterLineTexture = new RenderTexture((int)myCamera.pixelWidth, (int)myCamera.pixelHeight, 16); outterLineTexture.hideFlags = HideFlags.DontSave; } originPixelWidth = (int)myCamera.pixelWidth; originPixelHeight = (int)myCamera.pixelHeight; } void Update() { if (outterLineTexture) { int nowPixWidth = (int)myCamera.pixelWidth; int nowPixHeight = (int)myCamera.pixelHeight; if (originPixelWidth == nowPixWidth && originPixelHeight == nowPixHeight) { return; } if (originPixelWidth != nowPixWidth || originPixelHeight != nowPixHeight) { outterLineTexture = new RenderTexture(nowPixWidth, nowPixHeight, 16); originPixelWidth = nowPixWidth; originPixelHeight = nowPixHeight; } } } void OnDisable() { if (outterLineTexture) { outterLineCamera.targetTexture = null; DestroyImmediate(outterLineTexture); outterLineTexture = null; } if (m_CompositeMaterial) { DestroyImmediate(m_CompositeMaterial); } if (m_BlurMaterial) { DestroyImmediate(m_BlurMaterial); } if (m_outterLineMat) { DestroyImmediate(m_outterLineMat); } } public void FourTapCone(RenderTexture source, RenderTexture dest, int iteration) { float off = 0.5f + iteration * Spread; Graphics.BlitMultiTap(source, dest, blurMaterial, new Vector2(off, off), new Vector2(-off, off), new Vector2(off, -off), new Vector2(-off, -off) ); } void OnPreRender() { outterLineCamera.targetTexture = outterLineTexture; outterLineCamera.RenderWithShader(outterLineMat.shader, ""); } void OnRenderImage(RenderTexture source, RenderTexture destination) { Iterations = Mathf.Clamp(Iterations, 0, 15); Spread = Mathf.Clamp(Spread, 0.5f, 6.0f); RenderTexture buffer = RenderTexture.GetTemporary(outterLineTexture.width, outterLineTexture.height, 0); RenderTexture buffer2 = RenderTexture.GetTemporary(outterLineTexture.width, outterLineTexture.height, 0); Graphics.Blit(outterLineTexture, buffer); bool oddEven = true; for (int i = 0; i < Iterations; i++) { if (oddEven) FourTapCone(buffer, buffer2, i); else FourTapCone(buffer2, buffer, i); oddEven = !oddEven; } Graphics.Blit(source, destination); if (oddEven) { Graphics.Blit(outterLineTexture, buffer, cutoffMaterial); Graphics.Blit(buffer, destination, compositeMaterial); } else { Graphics.Blit(outterLineTexture, buffer2, cutoffMaterial); Graphics.Blit(buffer2, destination, compositeMaterial); } RenderTexture.ReleaseTemporary(buffer); RenderTexture.ReleaseTemporary(buffer2); } }