Unity Default Shader

11-11 440 views

修改UI/Default shader实现Gray效果

// Custom Gray by change UI/Default Unity built-in shader source. 
// https://github.com/TwoTailsGames/Unity-Built-in-Shaders
Shader "Custom/UI/UIGray"
{
     Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        //https://www.cnblogs.com/llstart-new0201/p/12681277.html
        _StencilComp ("Stencil Comparison", Float) = 8//比较方法, 一直通过检测,与1相反
        _Stencil ("Stencil ID", Float) = 0 //参考值
        _StencilOp ("Stencil Operation", Float) = 0//0表示保持原值, 1设为0, 2为用参考值代替原值
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255
        _ColorMask ("Color Mask", Float) = 15
        _Grey("Grey", Range(0.0, 1.0)) = 1.0
        //Use Alpha Clip:是否进行根据通道值剔除,如果开启则会按像素进行处理,否则按Rect形状进行模板值操作
        [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
    }

    SubShader
    {
        //https://docs.unity3d.com/Manual/SL-SubShaderTags.html
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }
        //模板测试 如果模板测试通过,则相应的像素点更新,否则不更新
        //https://blog.csdn.net/u011047171/article/details/46928463
        //if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
        //通过像素
        //else
        //抛弃像素

        Stencil
        {
            Ref [_Stencil] //设定参考值referenceValue, 用来与模板缓冲中的值比较
            Comp [_StencilComp]//定义参考值(referenceValue)与缓冲值(stencilBufferValue)比较的操作函数
            Pass [_StencilOp]//当模板测试(和深度测试)通过时,则根据此值对模板缓冲值(stencilBufferValue)进行处理
            ReadMask [_StencilReadMask]//读遮罩, readMask将和referenceValue以及stencilBufferValue进行按位与(&)操作, 255表示读取的为原始值
            WriteMask [_StencilWriteMask]//写入模板缓冲时进行按位与操作, 255表示写的为原始值
        }
        //https://docs.unity3d.com/Manual/SL-Pass.html
        //https://docs.unity3d.com/Manual/SL-CullAndDepth.html
        Cull Off
        Lighting Off
        ZWrite Off
        //ZTest is automatically set correctly for each Canvas
        //(LEqual, unless the Canvas is set to Screen Space Overlay, which sets it to Always)
        ZTest [unity_GUIZTestMode]
        //设置混合模式 rcAlpha * SrcColor + (1 - SrcAlpha) * DstColor
        Blend SrcAlpha OneMinusSrcAlpha
        //颜色过滤, 这里15表示不过滤
        ColorMask [_ColorMask]

        Pass
        {
            Name "Default"
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            
            //路径Unity\Editor\Data\CGIncludes unity辅助函数引用 
            #include "UnityCG.cginc"
            #include "UnityUI.cginc"
            //对unity的rect mask 2d 裁剪生效相关
            #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
            #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 texcoord  : TEXCOORD0;
                float4 worldPosition : TEXCOORD1;
                UNITY_VERTEX_OUTPUT_STEREO
            };
            //纹理采样
            sampler2D _MainTex;
            fixed4 _Color;
            //https://docs.unity3d.com/2017.4/Documentation/Manual/SL-UnityShaderVariables.html
            //Set automatically by Unity for UI only based on whether the texture being used is in Alpha8 format (the value is set to (1,1,1,0)) or not (the value is set to (0,0,0,0)).
            fixed4 _TextureSampleAdd;
            float4 _ClipRect;
            //_ST Scale和Translation的意思
            //_ST 声明附加tiling & offset信息, 使用TRANSFORM_TEX需要
			//https://docs.unity3d.com/Manual/SL-PropertiesInPrograms.html
            float4 _MainTex_ST;
            fixed _Grey;

            v2f vert(appdata_t v)
            {
                v2f OUT;
                UNITY_SETUP_INSTANCE_ID(v);//GPU Instancing是指由GPU和图形API支持的,用一个Draw Call同时绘制多个Geometry相同的物体的技术
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
                OUT.worldPosition = v.vertex;
                //MVP坐标变换
                OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
                //#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
                //在Material中可以设置的Tiling就是xy,Offset就是zw。The x,y contains texture scale, and z,w contains translation (offset)
                //TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的
                //等价于o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                //Add 添加一个我们自定义的颜色影响, 使用顶点颜色, 以便image组件颜色拾取器生效
                OUT.color = v.color * _Color;
                return OUT;
            }

            //屏幕像素 SV_Target是DX10+用于fragment函数着色器颜色输出的语义。DX9使用COLOR作为fragment函数输出语义 , 兼容没有区别
            fixed4 frag(v2f IN) : SV_Target
            {
                //tex2D 根据uv坐标拿到贴图颜色
                half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

                //Add 纯灰色, 比较难看
                // float grey = dot(color.rgb, fixed3(0.299, 0.587, 0.114));
                // return half4(grey,grey,grey,color.a);

                //Add 使灰色有通道效果
                fixed grey = dot(color.rgb, fixed3(0.299, 0.587, 0.114));
                color.rgb = fixed3(grey, grey, grey)*_Grey + color.rgb*(1-_Grey);
              
           
                #ifdef UNITY_UI_CLIP_RECT
                color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
                #endif

                #ifdef UNITY_UI_ALPHACLIP
                clip (color.a - 0.001);
                #endif

                return color;
            }
        ENDCG
        }
    }
}

Unity资源管理和加载

垃圾回收器的压缩操作是托管的堆与非托管的堆的区别所在.—C#高级编程第10版 ...

阅读全文

Unity EventSystem和EasyTouch

UGUI的点击事件本质是发送射线,之前我们使用EasyTouch兼容ugui 响应事件点击出于下面考虑: 1.不用每个响应点击的ui控件上都去挂事件监听脚本, 统一处理2...

阅读全文

一次简单的Unity资源提取

所谓简单, 那必须是菜鸟也能操作的, 不废话先上三板斧: 把xapk/apk包, 改为zip后缀, 解压缩, 发现是Unity做的, 很好找到ab文件, 用AssetStudio打开(如果...

阅读全文

欢迎留言