zoukankan      html  css  js  c++  java
  • unity 优化之overdraw查看

    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情况

  • 相关阅读:
    线程 day40
    进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38
    进程 day36
    操作系统的发展史 day36
    git项目.gitignore文件不生效解决办法
    Java8 Lambda表达式和流操作如何让你的代码变慢5倍
    @GetMapping和@PostMapping接收参数的格式
    Non-parseable POM C:Usersadmin.m2 epositoryorgspringframework问题解决方案
    hessian
    eclipse 中PlantUML的安装和使用
  • 原文地址:https://www.cnblogs.com/sanyejun/p/10246981.html
Copyright © 2011-2022 走看看