unity 優化之overdraw檢視
阿新 • • 發佈:2019-01-09
scene視圖裡面能直接看,開啟左上角那個下拉選項,選擇overdraw就行
轉載篇在game檢視下檢視overdraw: https://blog.csdn.net/complicatedcc/article/details/70214681
c#程式碼,要掛在攝像機上
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 這個指令碼掛在攝像機上才能正確執行 /// </summary> [RequireComponent(typeof(Camera))] public class DebugOverdrawMode : MonoBehaviour { public Shader m_OverdrawShader; private Camera m_Camera; private bool m_SceneFogSettings = false; private CameraClearFlags m_ClearFlagSetting; private Color m_BackGroundColor; void Awake() { m_Camera = GetComponent<Camera>(); StoreParam(); } //void OnLevelWasLoaded() //{ // //每次場景載入取消霧效,快取並在OnDisable後恢復 // m_SceneFogSettings = RenderSettings.fog; // RenderSettings.fog = false; //} void StoreParam() { m_SceneFogSettings = RenderSettings.fog; RenderSettings.fog = false; m_ClearFlagSetting = m_Camera.clearFlags; m_BackGroundColor = m_Camera.backgroundColor; } void OnEnable() { if (m_OverdrawShader == null) { m_OverdrawShader = Shader.Find("Custom/Overdraw"); //m_OverdrawShader = UnityEditor.EditorGUIUtility.LoadRequired("SceneView/SceneViewShowOverdraw.shader") as Shader; //應用unity自帶shader即可達到相同效果 } if (m_OverdrawShader != null && m_Camera != null) { RenderSettings.fog = false; m_Camera.clearFlags = CameraClearFlags.Color; m_Camera.backgroundColor = Color.black; m_Camera.SetReplacementShader(m_OverdrawShader, ""); bChanged = true; } } void OnDisable() { if (m_Camera != null) { RestoreParam(); } } void RestoreParam() { RenderSettings.fog = m_SceneFogSettings; //m_Camera.SetReplacementShader(null, ""); //和下面效果相同 m_Camera.ResetReplacementShader(); m_Camera.backgroundColor = m_BackGroundColor; m_Camera.clearFlags = m_ClearFlagSetting; } //測試方法 為了方便切換 可在非執行模式下測試 bool bChanged; bool bInited; [ContextMenu("ChangeMode")] public void ChangeMode() { if (bChanged) { RestoreParam(); } else { if (!bInited) { m_Camera = GetComponent<Camera>(); StoreParam(); m_OverdrawShader = Shader.Find("Custom/Overdraw"); bInited = true; } RenderSettings.fog = false; m_Camera.clearFlags = CameraClearFlags.Color; m_Camera.backgroundColor = Color.black; m_Camera.SetReplacementShader(m_OverdrawShader, ""); } bChanged = !bChanged; } }
shader程式碼
Shader "Custom/Overdraw" { SubShader { Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } LOD 100 Fog { Mode Off } ZWrite Off ZTest Always Blend One One Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return fixed4(0.1, 0.04, 0.02, 0); } ENDCG } } }
不過作者說這個不完全對,但是可以大概看下overdraw情況